> 文章列表 > pyqt6+vtk

pyqt6+vtk

pyqt6+vtk

这里用PyQt6+vtk9.2.6

pip install PyQt6 pyqt6-tools vtk

这里拉了一个水平布局
然后水平布局中加入QWidget,object name改为vtkWidget
pyqt6+vtk
右键Promote Widgets
Promoted class name: QVTKRenderWindowInteractor
Header file: vtkmodules.qt.QVTKRenderWindowInteractor
点击Add,然后Promote
pyqt6+vtk

最终的ui如下

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>Form</class><widget class="QWidget" name="Form"><property name="geometry"><rect><x>0</x><y>0</y><width>400</width><height>300</height></rect></property><property name="windowTitle"><string>Form</string></property><widget class="QWidget" name="horizontalLayoutWidget"><property name="geometry"><rect><x>0</x><y>0</y><width>401</width><height>301</height></rect></property><layout class="QHBoxLayout" name="horizontalLayout"><item><widget class="QVTKRenderWindowInteractor" name="vtkWidget" native="true"/></item></layout></widget></widget><customwidgets><customwidget><class>QVTKRenderWindowInteractor</class><extends>QWidget</extends><header>vtkmodules.qt.QVTKRenderWindowInteractor</header><container>1</container></customwidget></customwidgets><resources/><connections/>
</ui>

pyqt6+vtk

然后通过pyuic转成py

python -m PyQt6.uic.pyuic MyWidget.ui -o MyWidget.py

然后就是main.py了

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# noinspection PyUnresolvedReferences
import vtkmodules.vtkInteractionStyle
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2
from PyQt6 import QtGui
from PyQt6.QtWidgets import QWidget, QApplication
from vtkmodules.vtkFiltersSources import vtkSphereSource
from vtkmodules.vtkRenderingCore import (vtkActor,vtkPolyDataMapper,vtkRenderer
)from MyWidget import Ui_Formclass MyWindow(QWidget, Ui_Form):def __init__(self):super(MyWindow, self).__init__()self.setupUi(self)# Create sourcesource = vtkSphereSource()source.SetCenter(0, 0, 0)source.SetRadius(5.0)# Create a mappermapper = vtkPolyDataMapper()mapper.SetInputConnection(source.GetOutputPort())# Create an actoractor = vtkActor()actor.SetMapper(mapper)self.ren = vtkRenderer()self.ren.AddActor(actor)self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()self.ren.ResetCamera()self.iren.Initialize()self.iren.Start()def closeEvent(self, event: QtGui.QCloseEvent) -> None:self.vtkWidget.Finalize()if __name__ == '__main__':app = QApplication([])window = MyWindow()window.show()app.exec()

效果
pyqt6+vtk

注意事项:
这2句一定要写

import vtkmodules.vtkInteractionStyle
import vtkmodules.vtkRenderingOpenGL2

然后就是这个初始化也一定要写

self.iren.Initialize()
self.iren.Start()

最后的Finalize()也是

参考:
https://kitware.github.io/vtk-examples/site/Python/Widgets/EmbedInPyQt/
https://kitware.github.io/vtk-examples/site/Python/Tutorial/Tutorial_Step5/