我用 PyQt5 创建了一个 GUI,其中有一个我想绘制一些卷的区域。我有时希望对使用 PyVista 的“add_mesh_clip_plane”小部件的卷进行切片。第一次它总是工作得很好,但是当我尝试在同一个 QFrame 中绘制另一个具有相同切片功能的卷时,程序崩溃并且我得到一个“分段错误(核心转储)”错误,
有人知道/对我如何解决这个问题有任何想法吗?
我创建了一个小示例(代码如下),其中 QFrame 通过用户意愿的切片小部件广告绘制大脑或纳芙蒂蒂的头部。
在绘制它们之前,我清除了所有参与者的 QFrame 并通过“clear()”删除了它们的所有属性,我想避免的情况是:
1- 单击绘图 Nefertiti 2- 单击绘图 Nefertiti 或绘图大脑 3- 在 QFrame 区域内单击以移动切片小部件时,程序崩溃
我想在步骤 2) 之前完成删除网格,以便步骤 2) 与步骤 1) 一样工作
我尝试删除整个 QFrame 对象并从头开始重新创建它,但无济于事
PyQt5 图形用户界面:
---------------------------------
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'double_plot.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtWidgets # QtGui
class Ui_Test(object):
def setupUi(self, Test):
Test.setObjectName("Test")
Test.resize(642, 574)
self.widget = QtWidgets.QWidget(Test)
self.widget.setGeometry(QtCore.QRect(110, 30, 402, 433))
self.widget.setObjectName("widget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.vtkFrame = QtWidgets.QFrame(self.widget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred,
QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.vtkFrame.sizePolicy().
hasHeightForWidth())
self.vtkFrame.setSizePolicy(sizePolicy)
self.vtkFrame.setMinimumSize(QtCore.QSize(400, 400))
self.vtkFrame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.vtkFrame.setFrameShadow(QtWidgets.QFrame.Raised)
self.vtkFrame.setObjectName("vtkFrame")
self.verticalLayout.addWidget(self.vtkFrame)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.plotNef_button = QtWidgets.QPushButton(self.widget)
self.plotNef_button.setObjectName("plotNef_button")
self.horizontalLayout.addWidget(self.plotNef_button)
self.plotBrain_button = QtWidgets.QPushButton(self.widget)
self.plotBrain_button.setObjectName("plotBrain_button")
self.horizontalLayout.addWidget(self.plotBrain_button)
self.verticalLayout.addLayout(self.horizontalLayout)
self.retranslateUi(Test)
QtCore.QMetaObject.connectSlotsByName(Test)
def retranslateUi(self, Test):
_translate = QtCore.QCoreApplication.translate
Test.setWindowTitle(_translate("Test", "Test"))
self.plotNef_button.setText(_translate("Test", "Plot Nefertiti"))
self.plotBrain_button.setText(_translate("Test", "Plot Brain"))
主文件 - 可执行文件(python main.py)
-----------------------------------------------------------
import pyvista as pv
from pyvista import examples
from PyQt5 import QtWidgets
from double_plot import Ui_Test
class MainWindow(QtWidgets.QMainWindow, Ui_Test):
def __init__(self, *args, **kwargs):
QtWidgets.QMainWindow.__init__(self, *args, **kwargs)
self.setupUi(self)
self.mesh = None
self.vtk_widget = pv.QtInteractor(self.vtkFrame)
self.plotNef_button.clicked.connect(self.plot_nefertiti)
self.plotBrain_button.clicked.connect(self.plot_brain)
def plot_nefertiti(self):
self.vtk_widget.clear() # Remove all actors and properties
self.mesh = examples.download_nefertiti()
self.vtk_widget.add_mesh_clip_plane(self.mesh)
self.vtk_widget.update()
def plot_brain(self):
self.vtk_widget.clear() # Remove all actors and properties
self.mesh = examples.download_brain()
self.vtk_widget.add_mesh_clip_plane(self.mesh)
self.vtk_widget.update()
if __name__ == "__main__":
app = QtWidgets.QApplication([])
window = MainWindow()
window.show()
app.exec_()
如上所述,第2步使程序崩溃,提醒:
1- 单击绘图 Nefertiti 2- 单击绘图 Nefertiti 或绘图大脑
在 QFrame 区域内单击以移动切片小部件时,程序崩溃(仅在步骤 2 之后)