Qt添加VTK并绘制图形
文章目录
- 准备环境
- 使用VS创建Qt Widget项目
- 配置VTK依赖
- 调试
- C/C++
- 链接器
- 添加vtk窗口
- ���试代码
参考链接:
VS2017配置QT环境(详细版)_vs2017 qt-CSDN博客
QT5+VTK9.1最新配置方法_qt vtk-CSDN博客
VTK笔记-Qt5.12.11编译VTK9.0.3-QVTKOpenGLNativeWidget-CSDN博客
准备环境
环境: Qt 5.14.2 + VS 2017 + VTK9.0.0
安装好Qt及VS QT插件,编译VTK。
使用VS创建Qt Widget项目
在VS2017中依次点击文件-》新建-》工程,打开新建项目页面。
这里可以设置类名和文件名等,默认和项目名字一样。不需要修改的话直接点击Finish。
点击F5进入调试即可看到VS中出现了空的初始界面,到这里VS2017中的QT开发环境配置就全部完成了。
配置VTK依赖
项目右键 -> 属性
调试
环境:添加...\VTK\VTK-9.0.0\vtk-install\bind;
C/C++
常规 -> 附加包含目录:
添加 ...\VTK\VTK-9.0.0\vtk-install\include\vtk-9.0
链接器
常规 -> 附加库目录:
添加:
...\VTK\VTK-9.0.0\vtk-install\libd;
输入 -> 附加依赖项:
添加全部vtk库:
vtkChartsCore-9.0d.lib vtkCommonColor-9.0d.lib vtkCommonComputationalGeometry-9.0d.lib vtkCommonCore-9.0d.lib vtkCommonDataModel-9.0d.lib vtkCommonExecutionModel-9.0d.lib vtkCommonMath-9.0d.lib vtkCommonMisc-9.0d.lib vtkCommonSystem-9.0d.lib vtkCommonTransforms-9.0d.lib vtkDICOMParser-9.0d.lib vtkDomainsChemistry-9.0d.lib vtkdoubleconversion-9.0d.lib vtkexodusII-9.0d.lib vtkexpat-9.0d.lib vtkFiltersAMR-9.0d.lib vtkFiltersCore-9.0d.lib vtkFiltersExtraction-9.0d.lib vtkFiltersFlowPaths-9.0d.lib vtkFiltersGeneral-9.0d.lib vtkFiltersGeneric-9.0d.lib vtkFiltersGeometry-9.0d.lib vtkFiltersHybrid-9.0d.lib vtkFiltersHyperTree-9.0d.lib vtkFiltersImaging-9.0d.lib vtkFiltersModeling-9.0d.lib vtkFiltersParallel-9.0d.lib vtkFiltersParallelImaging-9.0d.lib vtkFiltersPoints-9.0d.lib vtkFiltersProgrammable-9.0d.lib vtkFiltersSelection-9.0d.lib vtkFiltersSMP-9.0d.lib vtkFiltersSources-9.0d.lib vtkFiltersStatistics-9.0d.lib vtkFiltersTexture-9.0d.lib vtkFiltersTopology-9.0d.lib vtkFiltersVerdict-9.0d.lib vtkfreetype-9.0d.lib vtkGeovisCore-9.0d.lib vtkgl2ps-9.0d.lib vtkglew-9.0d.lib vtkGUISupportQt-9.0d.lib vtkGUISupportQtSQL-9.0d.lib vtkhdf5-9.0d.lib vtkhdf5_hl-9.0d.lib vtkImagingColor-9.0d.lib vtkImagingCore-9.0d.lib vtkImagingFourier-9.0d.lib vtkImagingGeneral-9.0d.lib vtkImagingHybrid-9.0d.lib vtkImagingMath-9.0d.lib vtkImagingMorphological-9.0d.lib vtkImagingSources-9.0d.lib vtkImagingStatistics-9.0d.lib vtkImagingStencil-9.0d.lib vtkInfovisCore-9.0d.lib vtkInfovisLayout-9.0d.lib vtkInteractionImage-9.0d.lib vtkInteractionStyle-9.0d.lib vtkInteractionWidgets-9.0d.lib vtkIOAMR-9.0d.lib vtkIOAsynchronous-9.0d.lib vtkIOCityGML-9.0d.lib vtkIOCore-9.0d.lib vtkIOEnSight-9.0d.lib vtkIOExodus-9.0d.lib vtkIOExport-9.0d.lib vtkIOExportGL2PS-9.0d.lib vtkIOExportPDF-9.0d.lib vtkIOGeometry-9.0d.lib vtkIOHDF-9.0d.lib vtkIOImage-9.0d.lib vtkIOImport-9.0d.lib vtkIOInfovis-9.0d.lib vtkIOLegacy-9.0d.lib vtkIOLSDyna-9.0d.lib vtkIOMINC-9.0d.lib vtkIOMotionFX-9.0d.lib vtkIOMovie-9.0d.lib vtkIONetCDF-9.0d.lib vtkIOOggTheora-9.0d.lib vtkIOParallel-9.0d.lib vtkIOParallelXML-9.0d.lib vtkIOPLY-9.0d.lib vtkIOSegY-9.0d.lib vtkIOSQL-9.0d.lib vtkIOTecplotTable-9.0d.lib vtkIOVeraOut-9.0d.lib vtkIOVideo-9.0d.lib vtkIOXML-9.0d.lib vtkIOXMLParser-9.0d.lib vtkjpeg-9.0d.lib vtkjsoncpp-9.0d.lib vtklibharu-9.0d.lib vtklibproj-9.0d.lib vtklibxml2-9.0d.lib vtkloguru-9.0d.lib vtklz4-9.0d.lib vtklzma-9.0d.lib vtkmetaio-9.0d.lib vtknetcdf-9.0d.lib vtkogg-9.0d.lib vtkParallelCore-9.0d.lib vtkParallelDIY-9.0d.lib vtkpng-9.0d.lib vtkpugixml-9.0d.lib vtkRenderingAnnotation-9.0d.lib vtkRenderingContext2D-9.0d.lib vtkRenderingCore-9.0d.lib vtkRenderingFreeType-9.0d.lib vtkRenderingGL2PSOpenGL2-9.0d.lib vtkRenderingImage-9.0d.lib vtkRenderingLabel-9.0d.lib vtkRenderingLOD-9.0d.lib vtkRenderingOpenGL2-9.0d.lib vtkRenderingQt-9.0d.lib vtkRenderingSceneGraph-9.0d.lib vtkRenderingUI-9.0d.lib vtkRenderingVolume-9.0d.lib vtkRenderingVolumeOpenGL2-9.0d.lib vtkRenderingVtkJS-9.0d.lib vtksqlite-9.0d.lib vtksys-9.0d.lib vtkTestingRendering-9.0d.lib vtktheora-9.0d.lib vtktiff-9.0d.lib vtkverdict-9.0d.lib vtkViewsContext2D-9.0d.lib vtkViewsCore-9.0d.lib vtkViewsInfovis-9.0d.lib vtkViewsQt-9.0d.lib vtkWrappingTools-9.0d.lib vtkzlib-9.0d.lib
添加vtk窗口
QVTKOpenGLNativeWidget 实际上是VTK给写好的一个自定义控件,继承自QWidget类,所以只需要将QWdiget类提升为QVTKOpenGLNativeWidget类就行了
1.用Designer打开项目的界面文件(.ui后缀文件)
2.在左边的控件栏中,将Containers下的“Widget”这个控件拖入到用户界面中,然后右边的对象查看器中就能查到你拖入的QWidget控件对象。
3.对该对象点右键,选择“提升为”,提升为可以理解是将QT自带的控件类提升为开发者编写的自定义控件类。而QVTKOpenGLNativeWidget就是VTK编写的自定义控件类。
4.然后提升的类名称填上“QVTKOpenGLNativeWidget”,头文件填写“QVTKOpenGLNativeWidget.h”。基类选择QWidget。然后点击“添加”-》“提升”
提升的类名称:指自定义控件的类名称,VTK提供的自定义类名称就是QVTKOpenGLNativeWidget。
头文件:指自定义控件的头文件,VTK提供的自定义控件类的头文件就是QVTKOpenGLNativeWidget.h。注意大小写。如果不对应的话,会失效。
基类名称:指自定义的控件类的基类是谁,QVTKOpenGLNativeWidget的基类就是QWidget。选错了也是不行的。
添加:指保存这个设定,下次可以直接拿来使用,不用重新输入以上信息。
提升:指将你拖入UI中的QWidget控件,变成你写好的自定义控件类,在这里就是将QWidget类变成QVTKOpenGLNativeWidget类。
5.重命名该窗口控件的对象名,用来写代码的时候识别。网上所见通常命名为“qvtkWidget”
6.最后在你的主窗口类下调用ui的成员变量可以成功呼出qvtkWidget这个vtk窗口控件。
实际上以上就是自定义控件类的定义过程,区别是该自定义控件类不需要自己写一个类,而是VTK已经写好提供给我们,我们直接拿来提升就行了。
测试代码
#include "QtWidgetsApplication2.h" #include #include #include #include #include #include #include #include #include #include #include #include "vtkAutoInit.h" VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle); VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2); VTK_MODULE_INIT(vtkRenderingFreeType); QtWidgetsApplication2::QtWidgetsApplication2(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat()); vtkNew colors; vtkNew sphereSource; vtkNew sphereMapper; sphereMapper->SetInputConnection(sphereSource->GetOutputPort()); vtkNew sphereActor; sphereActor->SetMapper(sphereMapper); sphereActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData()); vtkNew renderer; renderer->AddActor(sphereActor); renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData()); vtkNew renderWindow; renderWindow->AddRenderer(renderer); renderWindow->SetWindowName("RenderWindowNoUIFile"); setCentralWidget(ui.widget); ui.widget->setRenderWindow(renderWindow); } QtWidgetsApplication2::~QtWidgetsApplication2() {}
运行结果: