Python 在PyQT5窗口中嵌入VTK对象
我正在做一个3D模型的生成性设计项目。我需要创建一个简单的QT应用程序,允许用户使用VTK查看网格,并包括一些按钮,用于反馈到生成算法中 GUI对我来说是一个全新的东西,所以我很难理解如何将查看器的代码集成到更广泛的程序中。现在我只想在查看器中创建一个按钮和一个3D圆锥体 到目前为止,我的代码在运行时崩溃。它使用给定链接中的QVTKRenderWindowInteractor()对象,该对象直接粘贴到文件中Python 在PyQT5窗口中嵌入VTK对象,python,qt,pyqt,pyqt5,vtk,Python,Qt,Pyqt,Pyqt5,Vtk,我正在做一个3D模型的生成性设计项目。我需要创建一个简单的QT应用程序,允许用户使用VTK查看网格,并包括一些按钮,用于反馈到生成算法中 GUI对我来说是一个全新的东西,所以我很难理解如何将查看器的代码集成到更广泛的程序中。现在我只想在查看器中创建一个按钮和一个3D圆锥体 到目前为止,我的代码在运行时崩溃。它使用给定链接中的QVTKRenderWindowInteractor()对象,该对象直接粘贴到文件中 调用方法Start()时,您正在启动事件循环,这意味着将不执行以下指令。通常,在完成VT
调用方法
Start()
时,您正在启动事件循环,这意味着将不执行以下指令。通常,在完成VTK管道之后,即在定义参与者、映射器等之后,启动事件循环
你检查过这个例子了吗
它工作正常,但假设您有PyQt4。为了使用PyQt5,我做了一些更改。试试这个:
import sys
import vtk
from PyQt5 import QtCore, QtGui
from PyQt5 import Qt
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
class MainWindow(Qt.QMainWindow):
def __init__(self, parent = None):
Qt.QMainWindow.__init__(self, parent)
self.frame = Qt.QFrame()
self.vl = Qt.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()
# 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)
self.ren.AddActor(actor)
self.ren.ResetCamera()
self.frame.setLayout(self.vl)
self.setCentralWidget(self.frame)
self.show()
self.iren.Initialize()
self.iren.Start()
if __name__ == "__main__":
app = Qt.QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())
重要提示:如果您的qt应用程序变得越来越复杂,并且您将在其中使用多个QVTKRenderWindowInteractor
对象,请不要通过Start()
方法调用interactor。否则,正如我前面提到的,您将在qt应用程序中创建另一个不必要的事件循环(app.exec()
启动qt循环)。在这种情况下,我认为应该在声明必要的对象后调用app.exec()
。更多信息可在以下链接中找到:
import sys
import vtk
from PyQt5 import QtCore, QtGui
from PyQt5 import Qt
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
class MainWindow(Qt.QMainWindow):
def __init__(self, parent = None):
Qt.QMainWindow.__init__(self, parent)
self.frame = Qt.QFrame()
self.vl = Qt.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()
# 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)
self.ren.AddActor(actor)
self.ren.ResetCamera()
self.frame.setLayout(self.vl)
self.setCentralWidget(self.frame)
self.show()
self.iren.Initialize()
self.iren.Start()
if __name__ == "__main__":
app = Qt.QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())