当前位置: 首页 > 知识库问答 >
问题:

在PyQT5窗口中嵌入VTK对象

廖夜洛
2023-03-14

我在做一个三维模型的生成设计项目。我需要创建一个简单的QT应用程序,允许用户使用VTK查看网格,并包括一些按钮反馈到生成算法。

GUI对我来说是一个全新的东西,所以我很难从这里为查看者集成代码到更广泛的程序中。现在,我只是试图在查看器中创建一个按钮和一个3D圆锥体。

到目前为止,我的代码在运行时崩溃。它使用给定链接中的QVTKRenderWindowInteractor()对象,该对象直接粘贴到文件中。

try:
    import sys
    import vtk
    from PyQt5.QtWidgets import QWidget, QSizePolicy, QApplication, QPushButton, QVBoxLayout
    from PyQt5.QtCore import Qt, pyqtSignal, QTimer, QObject, QSize, QEvent
except ImportError:
    raise ImportError("Cannot load either PyQt5")

共有1个答案

姜德容
2023-03-14

当调用方法start()时,您正在启动事件循环,这意味着以下指令将不会执行。在完成VTK管道之后,即在定义了参与者、映射器等之后,启动事件循环。

你在这里查过这个例子了吗?https://www.vtk.org/wiki/vtk/examples/python/widgets/embedpyqt

它工作得很好,但假设您有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()。更多信息可以在这些链接中找到:

  • https://www.vtk.org/doc/nightly/html/classqvtkinteractor.html#details
  • https://www.vtk.org/pipermail/vtkusers/2009-febuary/050560.html
  • https://public.kitware.com/pipermail/vtkusers/2006-july/036328.html
 类似资料:
  • 问题内容: 我正在尝试在JPanel中嵌入HWND(窗口句柄)。 实际上,我可以将HWND嵌入到JFrame中,但是嵌入式窗口始终位于其他组件的顶部,因此无法移动它。如果尝试删除我的JFrame的所有子组件,则HWND将保留在那里。HWND似乎是在JFrame顶部绘制的,而不是其中之一。 要将HWND嵌入到JPanel中,我通过jna使用User32: 我用它来获取我的JFrame的HWND: 有

  • 问题内容: 有谁知道一种在集成到Java应用程序中的Swing窗口中打开平台(Windows / Linux / Mac)浏览器实例的方法。除了打开给定的URL,其他操作都不会执行。当前,由于Java嵌入式浏览器不足,我们打开了一个新的浏览器窗口。但是,从用户交互的角度来看,这不是所希望的。 我很好奇这个解决方案是否是1.6 Java版本的一部分。因此,到目前为止,我的google-foo尚未引起

  • 所以我正在用pygame做一个游戏,我也想用tkinter。我在tkinter窗口中嵌入了一个pygame窗口,但我似乎什么都做不了。 对于上下文,以下是完整的代码: 当我使用时,什么都不会发生。在类中使用pyplay是有效的,但是在我更复杂的游戏中,为所有变量使用self.variable似乎是不必要的。 如何在window类之外的pygame窗口中运行代码?

  • 问题内容: 我正在使用PyQt5设计器进行一些应用。我主要与设计师合作,而不是从头开始构建,因此这可能是一个愚蠢的问题。基本上我有一个主菜单和一个“创建”按钮,单击该按钮将打开我一直在处理的其他pyqt5 .py文件(也在设计器中创建)。 到目前为止,我已将ui文件编译为.py文件,并导入了我希望能够生成多个ui的弹出窗口,然后使用此代码获得了一些成功: 我尚未将任何附加代码添加到转换后的ui文件

  • 问题内容: 我刚开始使用PyQt5。我一直在尝试完成一个看似非常简单的任务,但没有获得足够的信息。经过大量的谷歌搜索,我已经能够关闭一个窗口,并在另一个UI加载时启动另一个窗口,但这不是我要在这里做的。 我想在同一窗口中切换UI。我正在将UI文件作为全局变量加载到我的python文件中,其中每个UI有2个类。当我单击一个UI中的特定按钮时,我想切换到同一窗口中的另一个UI。下面是代码示例: 问题答

  • 问题内容: 我和一个朋友正在pygame做游戏。我们希望将pygame窗口嵌入到tkinter或WxPython框架中,以便我们可以包括WX或Tkinter支持的文本输入,按钮和下拉菜单。我搜寻了互联网上的答案,但发现的所有人都在问同样的问题,但都没有一个很好的答案。 实现嵌入到tkinter或WX框架中的pygame显示的最佳方法是什么?(最好是TKinter) 可以在pygame显示器旁边包含