Je construis un programme d'interface graphique avec pyqt5 (concepteur Qt) qui utilise également le bibliothèque PPTK . Cette bibliothèque peut tracer une énorme quantité de points qui est très intéressant à mon objectif (affichage des résultats de traitement des éléments finis). p>
3 Réponses :
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_())
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.
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 P> 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.
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_())
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 code> ou
Notepad code> 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 code> et il ne l'incorpore pas dans la fenêtre ... J'ai remarqué que si j'exécute le
calc.exe code> 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 code> 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 i> et d'espérer des améliorations à l'avenir.
qt: 5.11.1 code> et
pyqt5: 5.13.1 code>
@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.
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: 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. P> p>
Je n'ai pas l'expérience avec QtDesigner pour faire une réponse, mais s'il y a des méthodes
addwidget code>, 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 code>, 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 code> 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