使用vtkOrientationMarkerWidget与QVTKRenderWindowInteractor [PyQt4/PySide]

4
我正在使用QVTKRenderWindowInteractor小部件类开发一个PySide/vtk GUI。 该小部件运作良好,除非我尝试使用vtkOrientationMarkerWidget添加方向轴(见图片)。
axesActor = vtk.vtkAxesActor();
axes = vtk.vtkOrientationMarkerWidget()
axes.SetOrientationMarker(axesActor)
axes.SetInteractor(self.iren)
self.ren.AddActor(axesActor)
axes.EnabledOn() # <== application freeze-crash
axes.InteractiveOn()

已经有类似的Ubuntu的错误报告,表明该错误只在Qt示例中复现,而同样的没有Qt的示例却运行良好。

有什么解决这种行为的方法吗? 输入图像描述


你可以使用以下代码行替换最后两行:axes.On() - MrPedru22
在你的机器上测试了 axes.On(),窗口会冻结吗? - SAAD
使用 PySide 进行测试也会得到相同的行为。 - SAAD
1个回答

6

我从Nicholas R. Rypkema那里得到了这个答案:

https://nrr.mit.edu/blog/note-about-vtk-pyqt-and-vtkorientationmarkerwidget

简而言之:这将解决你的问题。

axesActor = vtk.vtkAxesActor();
self.axes = vtk.vtkOrientationMarkerWidget()
self.axes.SetOrientationMarker(axesActor)
self.axes.SetInteractor(self.iren)
self.ren.AddActor(axesActor)
self.axes.EnabledOn() # <== application freeze-crash
self.axes.InteractiveOn()

你应该将外部资源的必要部分添加到你的答案中。此外,你的代码片段是从原帖中复制的。 - m02ph3u5
2
谢谢,这对我有用!关键是通过将其设置为类成员(self.axes)来防止轴超出范围。 - mululu
1
这个问题得到了解决,正如@mululu所说,通过将vtkOrientationMarkerWidget实例的生命周期更改为主应用程序类的成员(该类是QtGui.QMainWindow的子类,并在其中定义了QVTKRenderWindowInteractor)。答案已被接受! - SAAD
我报告说,这个解决方案也适用于在C++中使用VTK时解决相同错误的情况,即应该将类型为vtkSmartPointer<vtkOrientationMarkerWidget>的变量作为类的成员,在整个VTK循环执行期间保持存在。 - Greg Kramida

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接