将 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 类型的变量应该成为在持续时间内存在的类的成员VTK 循环执行。

以上是关于将 vtkOrientationMarkerWidget 与 QVTKRenderWindowInteractor 一起使用 [PyQt4/PySide]的主要内容,如果未能解决你的问题,请参考以下文章

如何将Ios文件上传到

Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等

如何将视频文件转换格式

sh 一个将生成CA的脚本,将CA导入到钥匙串中,然后它将创建一个证书并与CA签名,然后将其导入到

python怎么将0写入文件?

如何将CMD窗口背景改成透明?