#python #pyqt5 #vtk
#python #pyqt5 #vtk
Вопрос:
Я пытаюсь встроить код рендеринга vtk в PyQt5 с помощью QVTKRenderWindowInteractor. Когда я попытался использовать vtkBoxWidget внутри него, произошел сбой программы. Без vtkBoxWidget (заключенного в две строки в приведенном ниже коде) он работает нормально. Не могли бы вы помочь мне найти проблему? Я пытаюсь вручную обрезать отображаемый объект с помощью ограничивающей рамки с помощью vtkBoxWidget.
код:
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QFrame, QVBoxLayout
import sys
import vtk
from PyQt5 import QtGui
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
class MainWindow(QMainWindow):
def __init__(self, parent=None):
QMainWindow.__init__(self, parent)
self.frame = QFrame()
self.vl = QVBoxLayout()
self.vtkWidget = QVTKRenderWindowInteractor(self.frame)
self.vl.addWidget(self.vtkWidget)
self.ren = vtk.vtkRenderer()
self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()
self.iren.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera())
# Create source
source = vtk.vtkSphereSource()
source.SetCenter(0, 0, 0)
source.SetRadius(5.0)
# Create a mapper
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(source.GetOutputPort())
# Create an actor
actor = vtk.vtkActor()
actor.SetMapper(mapper)
###################################################################################
boxWidget = vtk.vtkBoxWidget()
boxWidget.SetInteractor(self.iren)
boxWidget.SetPlaceFactor(1.0)
boxWidget.SetRotationEnabled(0)
planes = vtk.vtkPlanes()
def ClipVolumeRender(obj, event):
obj.GetPlanes(planes)
mapper.SetClippingPlanes(planes)
boxWidget.SetProp3D(actor)
boxWidget.PlaceWidget()
boxWidget.InsideOutOn()
boxWidget.AddObserver("InteractionEvent", ClipVolumeRender)
boxWidget.On()
###################################################################################
self.ren.AddActor(actor)
self.ren.ResetCamera()
self.frame.setLayout(self.vl)
self.setCentralWidget(self.frame)
self.show()
self.iren.Initialize()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())
Ответ №1:
Проблема в том, что boxWidget — это локальная переменная, которая удаляется python, поэтому впоследствии приложение пытается получить доступ к этому объекту, но у него больше нет выделенной памяти, генерирующей ошибку сегментации. Решение состоит в том, чтобы расширить область действия, изменив boxWidget
с self.boxWidget
помощью .