gpt4 book ai didi

python - 在 PyQT5 窗口中嵌入 VTK 对象

转载 作者:行者123 更新时间:2023-11-28 21:02:19 25 4
gpt4 key购买 nike

我正在从事 3D 模型的衍生式设计项目。我需要创建一个简单的 QT 应用程序,该应用程序允许用户使用 VTK 查看网格并包含一些用于对生成算法进行反馈的按钮。

GUI 对我来说是全新的东西,所以我很困惑如何集成来自 here 的代码让观众进入更广泛的节目。现在我只是想在查看器中创建一个按钮和一个 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, QEventexcept ImportError:    raise ImportError("Cannot load either PyQt5")

import vtk

class neuralDesignerApp(QWidget):
def __init__(self):
super(QWidget,self).__init__()
self.initUI()

def initUI(self):

app = QApplication(['QVTKRenderWindowInteractor'])
vtkWindow = QVTKRenderWindowInteractor(self)
vtkWindow.Initialize()
vtkWindow.Start()
ren = vtk.vtkRenderer()
vtkWindow.GetRenderWindow().AddRenderer(ren)

cone = vtk.vtkConeSource()
cone.SetResolution(8)

coneMapper = vtk.vtkPolyDataMapper()
coneMapper.SetInputConnection(cone.GetOutputPort())

coneActor = vtk.vtkActor()
coneActor.SetMapper(coneMapper)
ren.AddActor(coneActor)

btn1 = QPushButton("Button 1", self)

vbox = QVBoxLayout()
vbox.addWidget(vtkWindow)
vbox.addWidget(btn1)

self.setLayout(vbox)

self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Neural Designer')
self.show()

最佳答案

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

你在这里检查过这个例子吗? 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() 方法调用交互器。否则,正如我之前提到的,您将在 qt 应用程序中创建另一个不必要的事件循环(app.exec() 启动 qt 循环)。在这种情况下,我认为您应该在声明必要对象后调用 app.exec()。可以在这些链接中找到更多信息:

关于python - 在 PyQT5 窗口中嵌入 VTK 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48105646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com