??項(xiàng)目需要將一個(gè)基于控制臺的VTK程序合并到Qt界面中通過QVTKWidget顯示,由于第一次接觸VTK,很多東西不懂,網(wǎng)上關(guān)于VTK和Qt合并的資料又比較少,比較亂,折磨了兩天實(shí)現(xiàn)了合并,現(xiàn)總結(jié)如下。
1. Qt Designer添加QVTKWidget插件
??首先CMake編譯vtk源碼,我的環(huán)境VS2019社區(qū)版+VTK8.2.0+Qt5.12.0,完全按照這個(gè)鏈接的步驟一步步進(jìn)行編譯即可。一定要看仔細(xì)編譯的每個(gè)步驟?。?!
??CMake編譯vtk源碼步驟鏈接
??如果用不到PCL按照原文進(jìn)行到第5步即可,第6步及后面步驟可以忽略,忽略原文關(guān)于PCL的任何步驟。
注意: 只能復(fù)制release版本下的QVTKWidgetPlugin.dll、QVTKWidgetPlugin.exp、QVTKWidgetPlugin.lib,如果復(fù)制Debug版本下的 Qt Designer打不開,不知道為什么也許是個(gè)bug,但這并不影響后續(xù)在VS中Debug環(huán)境下的使用,此時(shí)應(yīng)該可以在Qt Designer左邊欄最下面看到QVTKWidget插件。
2. VS中配置工程屬性
說明:我的編譯好后的文件夾路徑為C:\VTK8.2.0
-
包含目錄:C:\VTK8.2.0\VTK-install\include\vtk-8.2
-
庫目錄:C:\VTK8.2.0\VTK-install\lib
-
調(diào)試環(huán)境:PATH=%PATH%;D:\Software\Qt\Qt5.12.0\5.12.0\msvc2017_64\bin;C:\VTK8.2.0\VTK-install\bin;
-
附加依賴項(xiàng):就是C:\VTK8.2.0\VTK-install\lib文件夾下所有.lib文件的文件名,可以通過批處理命令輕松快捷得到所有的.lib文件名。
獲取某一文件夾下文件名的批處理步驟:
新建一個(gè)1.txt,輸入如下命令:
dir /a-d /b *>scr.txt
再將1.txt后綴名改為.bat即1.bat,運(yùn)行就會生成一個(gè)scr.txt,里面存放的是文件名,復(fù)制所有.lib文件名(即去掉1.bat和scr.txt)到附加依賴項(xiàng)即可完成配置。這是我得到的.lib文件名,嫌麻煩的可以直接復(fù)制:
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的幾個(gè)附加依賴項(xiàng):
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交互窗口(重點(diǎn)!)
??第一次接觸VTK,不太懂VTK的一些概念,并且還要在Qt的QVTKWidhet中顯示,網(wǎng)上的資料很少,僅有的也比較亂,這篇博客給了我一些啟發(fā)和幫助,鏈接:QT基于VTK的體渲染程序
稍微看了一下《VTK圖形圖像開發(fā)進(jìn)階》張曉東,羅火靈編著這本書,很有幫助。
vtkRenderer* ren = vtkRenderer::New();
ui.qvtkWidget->GetRenderWindow()->AddRenderer(ren);
vtkSmartPointer<vtkRenderWindowInteractor> iren = ui.qvtkWidget->GetRenderWindow()->GetInteractor();
iren->SetRenderWindow(ui.qvtkWidget->GetRenderWindow());
/* 導(dǎo)入數(shù)據(jù),添加變量條等程序 */
//刷新渲染
ui.qvtkWidget->GetRenderWindow()->Render();
//初始化交互器
iren->Initialize();
//啟動交互器
iren->Start();
這段在QVTKWidget顯示交互窗口程序的重點(diǎn)就是
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);未經(jīng)處理的異常
參考資料
主函數(shù)前加上這三行:
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
4.2 消除vtk版本警告
除了主窗口,還會彈出一個(gè)關(guān)于VTK版本的警告窗口,這是我們不想看到的,加上一句話就可關(guān)閉這個(gè)警告。
//消除vtk版本警告
vtkOutputWindow::SetGlobalWarningDisplay(0);
4.3 基于控制臺的VTK程序合并到Qt界面(重點(diǎn))
項(xiàng)目中我來負(fù)責(zé)前端的整合,團(tuán)隊(duì)中另一位小伙寫的VTK程序是基于控制臺的,也就是運(yùn)行會彈出一個(gè)win32OpenGL窗口,我的任務(wù)就是把這個(gè)窗口在Qt界面中用QVTKWidget插件顯示,如本文第3部分所描述的。
??合并或者移植程序看似很簡單其實(shí)有時(shí)是個(gè)很麻煩的事情,尤其是一些配置的問題,這位團(tuán)隊(duì)成員給我的VTK程序所用的VTK編譯后的文件并不完全一樣因?yàn)樗麤]有涉及到Qt且有他自己寫的頭文件,經(jīng)過兩天的折騰,各種排列組合進(jìn)行試驗(yàn),最后合并成功。
??令基于控制臺的編譯文件為A,自己按照本文第1部分提到的步驟進(jìn)行編譯得到的文件為B,A和B大多數(shù)文件是一致的,此時(shí)就把A文件夾中的文件全部復(fù)制到B文件夾中,如果有相同文件名的點(diǎn)擊跳過該文件,不要點(diǎn)擊替換目標(biāo)中的文件,還是要以Qt版本的為準(zhǔn),不然會出現(xiàn)很多意想不到的錯(cuò)誤?。。?/mark>文章來源:http://www.zghlxwxcb.cn/news/detail-404998.html
此時(shí)再在合并后的lib文件夾下運(yùn)行批處理獲得新的文件名,添加到工程配置中的依賴項(xiàng),此時(shí)再按照第3部分修改代碼,完成合并。文章來源地址http://www.zghlxwxcb.cn/news/detail-404998.html
4.4 一些關(guān)于Qt結(jié)合VTK的資料
- 關(guān)于VTK在不同版本的Qt中的插件類別的不同
Study-VTK:QVTKWidget、QVTKOpenGLWidget、QVTKOpenGLNativeWidget、QVTKWidget2 區(qū)別
到了這里,關(guān)于Qt通過QVTKWidget顯示VTK交互窗口的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!