在 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_())
我需要在用户界面上呈现 .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_())