将 vtkOrientationMarkerWidget 与 QVTKRenderWindowInteractor 一起使用 [PyQt4/PySide]
Posted
技术标签:
【中文标题】将 vtkOrientationMarkerWidget 与 QVTKRenderWindowInteractor 一起使用 [PyQt4/PySide]【英文标题】:Using vtkOrientationMarkerWidget with QVTKRenderWindowInteractor [PyQt4/PySide] 【发布时间】:2016-06-07 09:33:43 【问题描述】:我使用 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()
一个类似的bug has been already reported for ubuntu,表明这个bug只能用Qt example重现,而同样的example without Qt效果很好。
此行为的任何解决方案?
【问题讨论】:
不要使用最后两行,你可以使用什么,你可以使用axes.On()
这一行
用axes.On()
测试过窗口死机,它在你的机器上工作吗?
使用 PySide 进行测试也给出了相同的行为
【参考方案1】:
从 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()
【讨论】:
您应该将场外资源中的重要部分添加到您的答案中。此外,您的代码 sn-p 是 OP 帖子中的 copypasta。 谢谢,这对我有用!关键是通过使其成为类成员(self.axes)来防止轴超出范围。 这解决了问题,正如@mululu 所说,通过更改vtkOrientationMarkerWidget
实例的生命周期,使其成为主应用程序类(其子类QtGui.QMainWindow
)的成员,其中QVTKRenderWindowInteractor
被定义为。答案已接受!
我报告说,这个解决方案也适用于在 C++ 中使用 VTK 时解决相同的错误,即 vtkSmartPointer以上是关于将 vtkOrientationMarkerWidget 与 QVTKRenderWindowInteractor 一起使用 [PyQt4/PySide]的主要内容,如果未能解决你的问题,请参考以下文章
Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等