1

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

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

有人可以为我澄清一下我必须经历什么吗?

4

3 回答 3

3

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

在此处输入图像描述

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_())
于 2019-11-19T15:20:02.213 回答
2

这是我从一开始就让它发挥作用的做法:

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

设计器是从 QtDesigner(QMainWindow 及其 QWidget 中央小部件)简单地开始。我刚刚保存了草稿,将其转换为 .py 文件。

这是我得到的:

嵌入式 pptk 查看器

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

于 2019-11-19T10:04:47.670 回答
1

了解如何克服黑色边框问题。PPTK 查看器需要在嵌入 PyQt 之前最大化,如下所示:

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

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

于 2020-08-04T00:14:17.280 回答