Qt添加VTK并绘制图形

小明 2025-05-04 13:34:15 7

文章目录

  • 准备环境
  • 使用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()
      {}
      

      运行结果:

The End
微信