在 PyQT5 中显示 vpl.mesh_plot

Displaying vpl.mesh_plot in PyQT5

我需要在用户界面上呈现 .stl 图像。

我用 PyQt5 创建了 UI,并且我已经设法用 vplotlib 渲染了 .stl 图像。但是,我在 UI 上的 Qframe 上显示此 vpl.mesh_plot 时遇到问题(名称:self.ui.MyQframe;window 不一定需要是这种类型, 也可以是 QGraphicsViewer 或其他)。

这是渲染 .stl 图像的函数:

import vtkplotlib as vpl
from stl.mesh import Mesh
def setScan(self):
        path, _ = QtWidgets.QFileDialog.getOpenFileName(None, "Select Image", "",
                                                            "stl Files (*.stl)")  # Ask for file
        mesh = Mesh.from_file(path)

        vpl.mesh_plot(path)

        vpl.mesh_plot(mesh)

        vpl.show()

##编辑 1: 根据 Eyllanesc 的回答,我将 QFrame 更改为 QtWidget,并在每个 vpl.mesh_ 中设置 fig=self.MyQtWidget ... + 相应地更改了 show()。

但是,它仍然作为一个新的 window 打开,我不确定为什么。

def setScan(self):
    path, _ = QtWidgets.QFileDialog.getOpenFileName(None, "Select Image", "",
                                                        "stl Files (*.stl)")  
    mesh = Mesh.from_file(path)
    self.MyQtWidget = vpl.QtFigure()

    vpl.mesh_plot(path,fig=self.MyQtWidget)

    vpl.mesh_plot(mesh,fig=self.MyQtWidget)
    self.MyQtWidget.show()

你必须使用 QtFigure 即 QWidget:

import sys

import vtkplotlib as vpl
from PyQt5 import QtWidgets
from stl.mesh import Mesh


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

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        vbox = QtWidgets.QVBoxLayout(central_widget)

        button = QtWidgets.QPushButton("Select STL")
        self.figure = vpl.QtFigure()
        vbox.addWidget(button)
        vbox.addWidget(self.figure)

        button.clicked.connect(self.select_filename)
        self.figure.show()

    def select_filename(self):
        path, _ = QtWidgets.QFileDialog.getOpenFileName(
            None, "Select Image", "", "stl Files (*.stl)"
        )
        if path:
            self.load_mesh(path)

    def load_mesh(self, filename):
        mesh = Mesh.from_file(filename)
        vpl.mesh_plot(mesh, fig=self.figure)


app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())