如何在PyQt5窗口中嵌入pptk查看器

我正在使用PyQt5(Qt Designer)构建GUI程序,该程序也使用pptk library。这个库可以绘制大量的点,这对我而言非常有趣(显示有限元素后处理结果)。

this post中所述,pptk的查看器类是一个独立的窗口。像上一篇文章的作者一样,我想将查看器嵌入到我的GUI中。看来我需要写一些包装器。经过研究,我仍然不知道这是否意味着我必须查看C ++代码才能重新编写某些内容。在这种情况下,它会比我想象的要复杂,我暂时必须放弃。最后,如果我可以创建一个可以集成到主窗口中的查看器小部件,那将是完美的。

有人可以帮我弄清楚我必须经历什么吗?

mydisable 回答:如何在PyQt5窗口中嵌入pptk查看器

这就是我从一开始就要做的事情:

# 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,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_())

设计器就像QtDesigner(带有QWidget centralwidget的QMainWindow)一样简单。我只是保存了草稿,并将其转换为.py文件。

这就是我得到的:

Embedded pptk viewer

窗口容器的侧面仍然有黑条,我还没有发现如何使它们消失。

,

下面是一个演示脚本,显示了如何将查看器添加到布局。我无法在Windows上对其进行测试,但是在Linux(没有win32gui部分)上,得到的结果如下所示。如您所见,没有奇怪的边框,并且可以正常调整窗口的大小。

enter image description here

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,"viewer")
        self.window = QtGui.QWindow.fromWinId(hwnd)    
        self.windowcontainer = self.createWindowContainer(self.window,widget)

        layout.addWidget(self.windowcontainer,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_())
,

了解如何解决黑边问题。将PPTK查看器嵌入PyQt之前需要使其最大化,如下所示:

    hwnd = win32gui.FindWindowEx(0,"viewer")
    win32gui.ShowWindow(hwnd,win32con.SW_MAXIMIZE)
    window = QtGui.QWindow.fromWinId(hwnd)
    windowContainer = QtWidgets.QWidget.createWindowContainer(window)

然后将windowContainer添加到要在其中显示它的小部件中(如以上其他答案所述)。第二行是应该解决黑边问题的关键。

本文链接:https://www.f2er.com/3118204.html

大家都在问