如何在 PyQt5 中嵌入 pptk 查看器 window
How to embed a pptk viewer in a PyQt5 window
我正在使用 PyQt5 (Qt Designer) 构建一个 GUI 程序,它也使用 pptk library。这个库可以绘制大量的点,这对我的目的来说非常有趣(显示有限元 post 处理结果)。
如 this post 中所述,来自 pptk 的查看器 class 是一个独立的 window。和之前post的作者一样,我想将查看器嵌入到我的GUI中。看来我需要写一些包装器。经过一些研究,我仍然不知道这是否意味着我必须查看 C++ 代码以重写一些东西。在那种情况下,它会比我想象的更复杂,我不得不暂时放弃。最后,如果我能创建一个可以集成到我的主 window 中的查看器小部件,那就太完美了。
有人可以为我澄清我必须经历的事情吗?
以下是我从一开始就做的事情:
# 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 centralwidget)一样简单。我只是保存了草稿,将其转换为.py文件。
这是我得到的:
windowcontainer的边上还有黑条,我还没发现怎么让它消失。
下面是演示如何将查看器添加到布局的演示脚本。我无法在 Windows 上测试它,但在 Linux 上(没有 win32gui
部分),我得到如下所示的结果。如您所见,没有奇怪的边框,window 可以像往常一样自由调整大小。
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_())
了解如何解决黑边问题。 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 添加到您要在其中显示它的小部件(如上面其他答案中所述)。第二行是解决黑边问题的关键。
我正在使用 PyQt5 (Qt Designer) 构建一个 GUI 程序,它也使用 pptk library。这个库可以绘制大量的点,这对我的目的来说非常有趣(显示有限元 post 处理结果)。
如 this post 中所述,来自 pptk 的查看器 class 是一个独立的 window。和之前post的作者一样,我想将查看器嵌入到我的GUI中。看来我需要写一些包装器。经过一些研究,我仍然不知道这是否意味着我必须查看 C++ 代码以重写一些东西。在那种情况下,它会比我想象的更复杂,我不得不暂时放弃。最后,如果我能创建一个可以集成到我的主 window 中的查看器小部件,那就太完美了。
有人可以为我澄清我必须经历的事情吗?
以下是我从一开始就做的事情:
# 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 centralwidget)一样简单。我只是保存了草稿,将其转换为.py文件。
这是我得到的:
windowcontainer的边上还有黑条,我还没发现怎么让它消失。
下面是演示如何将查看器添加到布局的演示脚本。我无法在 Windows 上测试它,但在 Linux 上(没有 win32gui
部分),我得到如下所示的结果。如您所见,没有奇怪的边框,window 可以像往常一样自由调整大小。
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_())
了解如何解决黑边问题。 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 添加到您要在其中显示它的小部件(如上面其他答案中所述)。第二行是解决黑边问题的关键。