0
votes

Comment intégrer une visionneuse PPTK dans une fenêtre PYQT5


9 commentaires

Je n'ai pas l'expérience avec QtDesigner pour faire une réponse, mais s'il y a des méthodes addwidget , vous devriez pouvoir simplement nourrir le spectateur à ceux qui devraient devenir un widget enfant au lieu d'une la fenêtre.


Voir: Qwidget.CreatewindowContainer et qwindow.fromwinid . Ou enveloppez la bibliothèque en utilisant SIP .


@ekhumoro Il n'est pas possible d'appeler le processus: Voir ce lien . Pourriez-vous me recommander un bon didacticiel pour commencer à apprendre d'envelopper les bibliothèques C ++?


@Christianhiricoiu Quelles preuves avez-vous pour cela? La réponse que vous avez liée est totalement faux - cela ne fait aucune différence en matière de démarrage du programme externe. Je ne peux pas garantir que cela fonctionnera (beaucoup dépend de ce que le système local prend en charge), mais vous ne le saurez pas, sauf si vous n'essayez réellement.


@Christianhiricoiu J'ai testé cela sur Linux et j'ai pu intégrer une visionneuse PPTK dans une fenêtre Pyqt sans aucun problème. Le seul problème est de savoir comment obtenir l'identifiant de la fenêtre de la visionneuse par programme. J'ai utilisé wmctrl , mais chaque plate-forme aura sa propre façon de le faire.


@ekhumoro je l'ai fait, ça a fonctionné mais pas comme je m'attendais. Votre PPTK Viewer intégré sous Linux s'est-il bien présent?


@Christianhiricoiu Oui, il s'affiche comme normal sur Linux. Le vwidget dans votre exemple doit aller dans une mise en page (comme tout autre widget) - mais ce n'est pas clair si vous avez fait cela.


@Christianhiricoiu Il vous aiderait si vous avez montré un exemple de reproductible minimal qui a démontré le problème plus clairement. Il est impossible de diagnostiquer sans voir tout le code.


@ekhumoro je n'ai pas essayé de redimensionner la fenêtreContainer, c'était le problème ... Merci beaucoup pour votre patience et votre aide


3 Réponses :


1
votes

Voici ce que j'ai fait du début pour le faire fonctionner:

# imports
from PyQt5 import QtWidgets, QtGui
import numpy as np
import pptk
import win32gui
import sys

# local imports
from designer import Ui_MainWindow


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi(self)

        self.cloudpoint = np.random.rand(100, 3)
        self.v = pptk.viewer(self.cloudpoint)                # generate the viewer window
        hwnd = win32gui.FindWindowEx(0, 0, None, "viewer")   # retrieve the window ID of the viewer
        self.window = QtGui.QWindow.fromWinId(hwnd)          # get the viewer inside a window

        # embed the window inside the centralwidget of the MainWindow :
        self.windowcontainer = self.createWindowContainer(self.window, self.centralwidget)

        # finally, resize the container as you wish.
        self.windowcontainer.resize(self.width() - 100 , self.height() - 100)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle("fusion")
    form = MainWindow()
    form.show()
    sys.exit(app.exec_())


1 commentaires

Pouvez-vous s'il vous plaît essayer le script de démonstration indiqué dans ma réponse, qui utilise une disposition appropriée? Cela devrait fonctionner sur Windows, mais je ne peux pas le tester moi-même.



1
votes

ci-dessous est un script de démonstration indiquant comment ajouter le visualiseur à une mise en page. Je ne peux pas le tester sous Windows, mais sur Linux (sans la partie win32gui code>), je reçois les résultats ci-dessous. Comme vous pouvez le constater, il n'y a pas de bordure étrange, et la fenêtre peut être librement redimensionnée comme normale.

Entrez l'image Description Ici P>

from PyQt5 import QtWidgets, QtGui
import numpy as np
import pptk
import win32gui
import sys

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        widget = QtWidgets.QWidget()
        layout = QtWidgets.QGridLayout(widget)
        self.setCentralWidget(widget)

        self.cloudpoint = np.random.rand(100, 3)
        self.v = pptk.viewer(self.cloudpoint)
        hwnd = win32gui.FindWindowEx(0, 0, None, "viewer")
        self.window = QtGui.QWindow.fromWinId(hwnd)    
        self.windowcontainer = self.createWindowContainer(self.window, widget)

        layout.addWidget(self.windowcontainer, 0, 0)

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    app.setStyle("fusion")
    form = MainWindow()
    form.setWindowTitle('PPTK Embed')
    form.setGeometry(100, 100, 600, 500)
    form.show()
    sys.exit(app.exec_())


8 commentaires

J'ai copié et coller votre code, j'ai toujours eu ces frontières noires étranges.


@Christianhiricoiu Bah - C'est une honte. Que se passe-t-il lorsque vous redimensionnez manuellement la fenêtre? Est-ce que quelque chose change? Il peut également être de tester une application Windows standard comme Calc ou Notepad pour voir si cela se comporte normalement. Lorsque j'ai testé sur Linux, j'ai trouvé que redimensionner manuellement la fenêtre a parfois montré brièvement les frontières noires. Donc, peut-être qu'il y a une sorte de retard de communication entre QT et le gestionnaire de fenêtres.


Lorsque je redimensionnez manuellement la fenêtre, les barres restent visibles mais leur largeur ne change pas (donc en mode plein écran sur un grand écran, il devient moins gênant, mais toujours là ...). Testé avec calc et il ne l'incorpore pas dans la fenêtre ... J'ai remarqué que si j'exécute le calc.exe avant d'exécuter le programme au lieu de le lancer de manière programmatique , il déplace la fenêtre de calcul derrière le QmainWindow généré. Il semble que cela reconnaisse la fenêtre et tente de la contenir, mais ne parvient pas à le faire. NB: Je suis sous Windows 10


@Christianhiricoiu Il semble que Buggy sur Windows. Quelles versions spécifiques de QT et PYQT5 utilisez-vous?


@Christianhiricoiu selon Qtbug-44404 , QT ne prend actuellement pas officiellement en utilisant CreewindowContainer avec des fenêtres externes. En outre, l'article Windows QT et étranger suggère que tout est toujours un travail en cours. Alors peut-être devrions-nous simplement être reconnaissants que cela fonctionne du tout et d'espérer des améliorations à l'avenir.


qt: 5.11.1 et pyqt5: 5.13.1


@Christianhiricoiu J'utilise Qt-5.13.2 et PYQT-5.13.2.2.2, peut-être que la mise à niveau peut être utile.


Ah ok merci pour l'info! Et merci beaucoup pour votre aide, j'ai maintenant un outil fonctionnel et c'est ce qui compte le plus.



1
votes

Découvrez comment surmonter le problème de la frontière noire. Le spectateur PPTK doit être maximisé avant d'être intégré à Pyqt, comme: xxx

puis ajoutez simplement la fenêtreContainer au widget que vous l'affiche (comme expliqué dans d'autres réponses ci-dessus). La deuxième ligne est la clé qui devrait résoudre le problème de la frontière noire.


0 commentaires