pyqt6+vtk 多种交互方式测试
QVTKRenderWindowInteractor 3D交互窗口
-
环境搭建不再赘述,本文主要介绍QVTKRenderWindowInteractor显示3d模型和修改交互方式
-
首先使用qt的designer设计器创建一个gui_vtk.ui文件
- 窗体中放入一个Qwidget控件,默认名称,再放入一个QComboBox控件取名ccb_interactor,内容如下,这些交互方式是vtk提供的,也可以增加自己定义的交互方式,常用的为前4个
- 窗体中放入一个Qwidget控件,默认名称,再放入一个QComboBox控件取名ccb_interactor,内容如下,这些交互方式是vtk提供的,也可以增加自己定义的交互方式,常用的为前4个
-
然后使用uic转换成gui_vtk.py文件
-
创建一个vtk_text.py文件,作为主程序文件
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
mainwindow = QtWidgets.QMainWindow()
# mainwindow=gui_vtk_slot.MyWindow()
ui = gui_vtk.Ui_MainWindow()
ui.setupUi(mainwindow)
# 建立信号连接
ui.ccb_interactor.currentIndexChanged.connect(slot_interactor)
#创建渲染窗口,父窗口为ui.widget
vtk_show = QVTKRenderWindowInteractor(ui.widget)
vtk_show.SetInteractorStyle(vtkInteractorStyleTrackballCamera()) # 设置交互方式==常用的方式 移动摄像机
mainwindow.show()
vtk_show.resize(ui.widget.size())
# vtkPolyData数据生成与显示
conSource = vtkConeSource() # 定义了一个椎体的图形数据
conSource.Update()
cone = conSource.GetOutput()
nPoints = cone.GetNumberOfPoints() # 获取图形数据的点数
nCells = cone.GetNumberOfCells() # 获取图形数据的单元数目
print('Points number:', nPoints)
print('Cells number:', nCells)
# 图形渲染与图像渲染基本一致
mapper = vtkPolyDataMapper()
mapper.SetInputData(cone)
actor = vtkActor()
actor.SetMapper(mapper)
renderer = vtkRenderer()
renderer.AddActor(actor)
renderer.SetBackground(0.0, 1.0, 1.0)
vtk_show.GetRenderWindow().AddRenderer(renderer)
vtk_show.Render()
vtk_show.Start()
app.exec()
sys.exit()
- 然后增加一个槽函数slot_interactor
def slot_interactor(index):
#各种交互方式
if index == 0:
vtk_show.SetInteractorStyle(vtkInteractorStyleJoystickActor())
elif index == 1:
vtk_show.SetInteractorStyle(vtkInteractorStyleJoystickCamera())
elif index == 2:
vtk_show.SetInteractorStyle(vtkInteractorStyleTrackballActor())
elif index == 3:
vtk_show.SetInteractorStyle(vtkInteractorStyleTrackballCamera())
elif index == 4:
vtk_show.SetInteractorStyle(vtkInteractorStyleSwitch())
elif index == 5:
vtk_show.SetInteractorStyle(vtkInteractorStyleFlight())
elif index == 6:
vtk_show.SetInteractorStyle(vtkInteractorStyleUnicam())
elif index == 7:
vtk_show.SetInteractorStyle(vtkInteractorStyleTerrain())
elif index == 8:
vtk_show.SetInteractorStyle(vtkInteractorStyleRubberBandZoom())
elif index == 9:
vtk_show.SetInteractorStyle(vtkInteractorStyleRubberBand2D())
elif index == 10:
vtk_show.SetInteractorStyle(vtkInteractorStyleDrawPolygon())
elif index == 11:
vtk_show.SetInteractorStyle(vtkInteractorStyle3D())
elif index == 12:
vtk_show.SetInteractorStyle(vtkInteractorStyleImage())
# vtk_show.resize(ui.widget.size())
# print(str(index))
- 至于每种交互方式具体含义,可以自己试试
交互器快捷键
ha
- p 选中鼠标所选的控件
- r 复位模型
- s 体显示
- w 线框显示
- f 放大
搞了个qq群,寻找大佬互相学习