Qt通过QVTKWidget显示VTK交互窗口

这篇具有很好参考价值的文章主要介绍了Qt通过QVTKWidget显示VTK交互窗口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


  项目需要将一个基于控制台的VTK程序合并到Qt界面中通过QVTKWidget显示,由于第一次接触VTK,很多东西不懂,网上关于VTK和Qt合并的资料又比较少,比较乱,折磨了两天实现了合并,现总结如下。

1. Qt Designer添加QVTKWidget插件

  首先CMake编译vtk源码,我的环境VS2019社区版+VTK8.2.0+Qt5.12.0,完全按照这个链接的步骤一步步进行编译即可。一定要看仔细编译的每个步骤!!!
  CMake编译vtk源码步骤链接
  如果用不到PCL按照原文进行到第5步即可,第6步及后面步骤可以忽略,忽略原文关于PCL的任何步骤。
注意: 只能复制release版本下的QVTKWidgetPlugin.dll、QVTKWidgetPlugin.exp、QVTKWidgetPlugin.lib,如果复制Debug版本下的 Qt Designer打不开,不知道为什么也许是个bug,但这并不影响后续在VS中Debug环境下的使用,此时应该可以在Qt Designer左边栏最下面看到QVTKWidget插件。
Qt通过QVTKWidget显示VTK交互窗口

2. VS中配置工程属性

说明:我的编译好后的文件夹路径为C:\VTK8.2.0

  1. 包含目录:C:\VTK8.2.0\VTK-install\include\vtk-8.2

  2. 库目录:C:\VTK8.2.0\VTK-install\lib

    Qt通过QVTKWidget显示VTK交互窗口

  3. 调试环境:PATH=%PATH%;D:\Software\Qt\Qt5.12.0\5.12.0\msvc2017_64\bin;C:\VTK8.2.0\VTK-install\bin;

    Qt通过QVTKWidget显示VTK交互窗口

  4. 附加依赖项:就是C:\VTK8.2.0\VTK-install\lib文件夹下所有.lib文件的文件名,可以通过批处理命令轻松快捷得到所有的.lib文件名。

    获取某一文件夹下文件名的批处理步骤:
    新建一个1.txt,输入如下命令:
    dir /a-d /b *>scr.txt
    再将1.txt后缀名改为.bat即1.bat,运行就会生成一个scr.txt,里面存放的是文件名,复制所有.lib文件名(即去掉1.bat和scr.txt)到附加依赖项即可完成配置。
    Qt通过QVTKWidget显示VTK交互窗口

    这是我得到的.lib文件名,嫌麻烦的可以直接复制:

    vtkChartsCore-8.2_gd.lib
    vtkCommonColor-8.2_gd.lib
    vtkCommonComputationalGeometry-8.2_gd.lib
    vtkCommonCore-8.2_gd.lib
    vtkCommonDataModel-8.2_gd.lib
    vtkCommonExecutionModel-8.2_gd.lib
    vtkCommonMath-8.2_gd.lib
    vtkCommonMisc-8.2_gd.lib
    vtkCommonSystem-8.2_gd.lib
    vtkCommonTransforms-8.2_gd.lib
    vtkDICOMParser-8.2_gd.lib
    vtkDomainsChemistry-8.2_gd.lib
    vtkDomainsChemistryOpenGL2-8.2_gd.lib
    vtkdoubleconversion-8.2_gd.lib
    vtkexodusII-8.2_gd.lib
    vtkexpat-8.2_gd.lib
    vtkFiltersAMR-8.2_gd.lib
    vtkFiltersCore-8.2_gd.lib
    vtkFiltersExtraction-8.2_gd.lib
    vtkFiltersFlowPaths-8.2_gd.lib
    vtkFiltersGeneral-8.2_gd.lib
    vtkFiltersGeneric-8.2_gd.lib
    vtkFiltersGeometry-8.2_gd.lib
    vtkFiltersHybrid-8.2_gd.lib
    vtkFiltersHyperTree-8.2_gd.lib
    vtkFiltersImaging-8.2_gd.lib
    vtkFiltersModeling-8.2_gd.lib
    vtkFiltersParallel-8.2_gd.lib
    vtkFiltersParallelImaging-8.2_gd.lib
    vtkFiltersPoints-8.2_gd.lib
    vtkFiltersProgrammable-8.2_gd.lib
    vtkFiltersSelection-8.2_gd.lib
    vtkFiltersSMP-8.2_gd.lib
    vtkFiltersSources-8.2_gd.lib
    vtkFiltersStatistics-8.2_gd.lib
    vtkFiltersTexture-8.2_gd.lib
    vtkFiltersTopology-8.2_gd.lib
    vtkFiltersVerdict-8.2_gd.lib
    vtkfreetype-8.2_gd.lib
    vtkGeovisCore-8.2_gd.lib
    vtkgl2ps-8.2_gd.lib
    vtkglew-8.2_gd.lib
    vtkGUISupportQt-8.2_gd.lib
    vtkGUISupportQtOpenGL-8.2_gd.lib
    vtkGUISupportQtSQL-8.2_gd.lib
    vtkhdf5-8.2_gd.lib
    vtkhdf5_hl-8.2_gd.lib
    vtkImagingColor-8.2_gd.lib
    vtkImagingCore-8.2_gd.lib
    vtkImagingFourier-8.2_gd.lib
    vtkImagingGeneral-8.2_gd.lib
    vtkImagingHybrid-8.2_gd.lib
    vtkImagingMath-8.2_gd.lib
    vtkImagingMorphological-8.2_gd.lib
    vtkImagingSources-8.2_gd.lib
    vtkImagingStatistics-8.2_gd.lib
    vtkImagingStencil-8.2_gd.lib
    vtkInfovisCore-8.2_gd.lib
    vtkInfovisLayout-8.2_gd.lib
    vtkInteractionImage-8.2_gd.lib
    vtkInteractionStyle-8.2_gd.lib
    vtkInteractionWidgets-8.2_gd.lib
    vtkIOAMR-8.2_gd.lib
    vtkIOAsynchronous-8.2_gd.lib
    vtkIOCityGML-8.2_gd.lib
    vtkIOCore-8.2_gd.lib
    vtkIOEnSight-8.2_gd.lib
    vtkIOExodus-8.2_gd.lib
    vtkIOExport-8.2_gd.lib
    vtkIOExportOpenGL2-8.2_gd.lib
    vtkIOExportPDF-8.2_gd.lib
    vtkIOGeometry-8.2_gd.lib
    vtkIOImage-8.2_gd.lib
    vtkIOImport-8.2_gd.lib
    vtkIOInfovis-8.2_gd.lib
    vtkIOLegacy-8.2_gd.lib
    vtkIOLSDyna-8.2_gd.lib
    vtkIOMINC-8.2_gd.lib
    vtkIOMovie-8.2_gd.lib
    vtkIONetCDF-8.2_gd.lib
    vtkIOParallel-8.2_gd.lib
    vtkIOParallelXML-8.2_gd.lib
    vtkIOPLY-8.2_gd.lib
    vtkIOSegY-8.2_gd.lib
    vtkIOSQL-8.2_gd.lib
    vtkIOTecplotTable-8.2_gd.lib
    vtkIOVeraOut-8.2_gd.lib
    vtkIOVideo-8.2_gd.lib
    vtkIOXML-8.2_gd.lib
    vtkIOXMLParser-8.2_gd.lib
    vtkjpeg-8.2_gd.lib
    vtkjsoncpp-8.2_gd.lib
    vtklibharu-8.2_gd.lib
    vtklibxml2-8.2_gd.lib
    vtklz4-8.2_gd.lib
    vtklzma-8.2_gd.lib
    vtkmetaio-8.2_gd.lib
    vtkNetCDF-8.2_gd.lib
    vtkogg-8.2_gd.lib
    vtkParallelCore-8.2_gd.lib
    vtkpng-8.2_gd.lib
    vtkproj-8.2_gd.lib
    vtkpugixml-8.2_gd.lib
    vtkRenderingAnnotation-8.2_gd.lib
    vtkRenderingContext2D-8.2_gd.lib
    vtkRenderingContextOpenGL2-8.2_gd.lib
    vtkRenderingCore-8.2_gd.lib
    vtkRenderingFreeType-8.2_gd.lib
    vtkRenderingGL2PSOpenGL2-8.2_gd.lib
    vtkRenderingImage-8.2_gd.lib
    vtkRenderingLabel-8.2_gd.lib
    vtkRenderingLOD-8.2_gd.lib
    vtkRenderingOpenGL2-8.2_gd.lib
    vtkRenderingQt-8.2_gd.lib
    vtkRenderingVolume-8.2_gd.lib
    vtkRenderingVolumeOpenGL2-8.2_gd.lib
    vtksqlite-8.2_gd.lib
    vtksys-8.2_gd.lib
    vtktheora-8.2_gd.lib
    vtktiff-8.2_gd.lib
    vtkverdict-8.2_gd.lib
    vtkViewsContext2D-8.2_gd.lib
    vtkViewsCore-8.2_gd.lib
    vtkViewsInfovis-8.2_gd.lib
    vtkViewsQt-8.2_gd.lib
    vtkzlib-8.2_gd.lib

    有的可能需要加上Qt的几个附加依赖项:

    D:\Software\Qt\Qt5.12.0\5.12.0\msvc2017_64\lib\Qt5Core.lib
    D:\Software\Qt\Qt5.12.0\5.12.0\msvc2017_64\lib\Qt5Gui.lib
    D:\Software\Qt\Qt5.12.0\5.12.0\msvc2017_64\lib\Qt5Widgets.lib

    完成上述步骤后即可正常在Qt界面显示VTK的交互窗口或者图形。

3. Qt显示VTK交互窗口(重点!)

  第一次接触VTK,不太懂VTK的一些概念,并且还要在Qt的QVTKWidhet中显示,网上的资料很少,仅有的也比较乱,这篇博客给了我一些启发和帮助,链接:QT基于VTK的体渲染程序
稍微看了一下《VTK图形图像开发进阶》张晓东,罗火灵编著这本书,很有帮助。
Qt通过QVTKWidget显示VTK交互窗口

vtkRenderer* ren = vtkRenderer::New();
ui.qvtkWidget->GetRenderWindow()->AddRenderer(ren);
vtkSmartPointer<vtkRenderWindowInteractor> iren = ui.qvtkWidget->GetRenderWindow()->GetInteractor();
iren->SetRenderWindow(ui.qvtkWidget->GetRenderWindow());
/*               导入数据,添加变量条等程序                */
//刷新渲染
ui.qvtkWidget->GetRenderWindow()->Render();
//初始化交互器
iren->Initialize();
//启动交互器
iren->Start();

这段在QVTKWidget显示交互窗口程序的重点就是

vtkSmartPointer iren = ui.qvtkWidget->GetRenderWindow()->GetInteractor();

ui.qvtkWidget->GetRenderWindow()
代替
vtkRenderWindow* renWin = vtkRenderWindow::New();的renWin

4.一些小问题(Last but not least)

4.1 qvtkWidget = new QVTKWidget(centralWidget);未经处理的异常

Qt通过QVTKWidget显示VTK交互窗口

参考资料
主函数前加上这三行:

#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

Qt通过QVTKWidget显示VTK交互窗口

4.2 消除vtk版本警告

除了主窗口,还会弹出一个关于VTK版本的警告窗口,这是我们不想看到的,加上一句话就可关闭这个警告。
Qt通过QVTKWidget显示VTK交互窗口

//消除vtk版本警告
	vtkOutputWindow::SetGlobalWarningDisplay(0);

4.3 基于控制台的VTK程序合并到Qt界面(重点)

项目中我来负责前端的整合,团队中另一位小伙写的VTK程序是基于控制台的,也就是运行会弹出一个win32OpenGL窗口,我的任务就是把这个窗口在Qt界面中用QVTKWidget插件显示,如本文第3部分所描述的。
Qt通过QVTKWidget显示VTK交互窗口

  合并或者移植程序看似很简单其实有时是个很麻烦的事情,尤其是一些配置的问题,这位团队成员给我的VTK程序所用的VTK编译后的文件并不完全一样因为他没有涉及到Qt且有他自己写的头文件,经过两天的折腾,各种排列组合进行试验,最后合并成功。
  令基于控制台的编译文件为A,自己按照本文第1部分提到的步骤进行编译得到的文件为B,A和B大多数文件是一致的,此时就把A文件夹中的文件全部复制到B文件夹中,如果有相同文件名的点击跳过该文件,不要点击替换目标中的文件,还是要以Qt版本的为准,不然会出现很多意想不到的错误!!!

Qt通过QVTKWidget显示VTK交互窗口
此时再在合并后的lib文件夹下运行批处理获得新的文件名,添加到工程配置中的依赖项,此时再按照第3部分修改代码,完成合并。文章来源地址https://www.toymoban.com/news/detail-404998.html

4.4 一些关于Qt结合VTK的资料

  1. 关于VTK在不同版本的Qt中的插件类别的不同
    Study-VTK:QVTKWidget、QVTKOpenGLWidget、QVTKOpenGLNativeWidget、QVTKWidget2 区别

到了这里,关于Qt通过QVTKWidget显示VTK交互窗口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【VTK】VTK 显示小球例子,在 Windows 上使用 Visual Studio 配合 Qt 构建 VTK

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 编号 内容 1 【Visual Studio】在 Windows 上使用 Visual Studio 构建 VTK 2 【Visual Studio】在 Windows 上使用 Visual Studio 配合 Qt 构建 VTK 3 【VTK】VTK 显示小球例子,在 Windows 上使用 Visual Studio 配

    2024年02月17日
    浏览(45)
  • 【VTK】读取一个 STL 文件,并使用 Qt 显示出来,在 Windows 上使用 Visual Studio 配合 Qt 构建 VTK

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 直接先把效果放出来,有需要就往下看。 骷髅3D打印3D模型

    2024年02月14日
    浏览(52)
  • VS+QT+VTK三维网格显示-点面选择-法线法向量显示-配准-分割窗体程序

    程序示例精选 VS+QT+VTK三维网格显示-点面选择-法线法向量显示-配准-分割窗体程序 如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助! 这篇博客针对VS+QT+VTK三维网格显示-点面选择-法线法向量显示-配准-分割窗体程序编写代码,代码整洁,规则

    2024年02月10日
    浏览(41)
  • 【QT项目:视频播放器——Qt opengl编程】通过shader完成显示yuv

    通过Qt opengl不是为了3D绘制,而是为了将视频绘制起来 使用opengl 可以极大降低yuv转rgb的转换开销 1、为什么用QT的opengl 简单,界面可以自动叠加 void paintGL(); // 具体的绘制写在该函数里 void initializeGL(); // 材质初始化 void resizeGL(int width, int height); // 当窗口发生变化(缩放) QO

    2023年04月09日
    浏览(42)
  • pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

    先添加一个带有ui的QT应用程序。 先拖出来一个QOpenGLWidget控件 修改布局如下: 然后将QOpenGLWidget控件提升为QVTKOpenGLNativeWidget控件,步骤如下: 右击QOpenGLWidget窗口,选择【提示为...】  输入提升的类名称为QVTKOpenGLNativeWidget  此时需要把自动生成的qvtkopenglnativewidget.h修改为QV

    2024年01月25日
    浏览(26)
  • qt怎么一个程序显示两个窗口

    首先我们要把.ui文件的QMainWindow改成QDialog(用记事本)  然后把.ui对应的头文件和.cpp 出现QMainWindow改成QDialog 如图重点其包含头文件定义也记得修改    然后非模态显示,才不堵塞主窗口

    2024年02月12日
    浏览(25)
  • 基于WPF Opencv实现一个图像可移动、缩放和可交互的显示窗口

    学习Halcon的HSmartWindowControl窗口控件,用WPF和Opencv仿照了一个。 显示控件的主体是两个Canvas: Root Canvas是背景,刷上了网格; 把要显示的图像作为Image Canvas的图像背景, 后面图像的移动,缩放,实质都是Image Canvas。 可交互,学习的是Halcon的绘图对象,WPF的Path来实现的,Path类

    2023年04月09日
    浏览(31)
  • 可视可交互!在全志H618上用OpenCV读取图像显示到PyQt5窗口上

    OpenCV能够处理图像、视频、深度图像等各种类型的视觉数据,在某些情况下,尽管OpenCV可以显示窗口,但PyQt5可能更适合用于创建复杂的交互式应用程序,而自带GPU的H618就成为了这些图像显示的最佳载体。 这里分享一个代码,功能是使用图像处理库opencv从摄像头获取数据,缩

    2024年02月01日
    浏览(35)
  • VTK--交互方式vtkInteractorStyleTrackballCamera

    很高兴在雪易的CSDN遇见你 ,给你糖糖 欢迎大家加入 雪易社区-CSDN社区云   本博文主要介绍vtk中基于Camera的交互方式vtkInteractorStyleTrackballCamera 及其子类,小伙伴可以根据需求自定义交互方式。 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我

    2024年02月05日
    浏览(28)
  • QT学习记录(三)通过ui和代码的方式往窗口添加组件

    本文是b站教程的https://www.bilibili.com/video/BV1g4411H78N?p=5vd_source=a3efe214b8a2ba185e92e79cb6d6321b的笔记,外加自己的一些其他想法。如有侵权请联系。如有错误请指正。 通过拖拽,把一个按钮和一个label拖进去了。 新建了一个按钮对象,并通过setParent指定了父亲就是当前的主窗口。 当

    2024年02月07日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包