当您调用方法 Start() 时,您正在启动事件循环,这意味着将不会执行以下指令 . 简单地说,在完成VTK管道之后,即在定义了actor,mappers等之后启动事件循环 .
它工作正常,但假设你有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() 方法调用交互器 . 否则,正如我之前提到的,你在qt应用程序中创建另一个不必要的事件循环( app.exec() 启动qt循环) . 在这种情况下,我认为你应该在声明必要的对象后调用 app.exec() . 可在以下链接中找到更多信息:
本文介绍如何在PyQT5窗口中嵌入VTK对象,通过QVTKRenderWindowInteractor实现。内容包括创建renderer、mapper、actor,并在窗口中展示3D球体。同时提醒在复杂Qt应用中避免错误使用交互器的Start()方法,以免启动额外的事件循环。

1901

被折叠的 条评论
为什么被折叠?



