logo资料库

VTK与Qt整合的示例.pdf

第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
资料共11页,剩余部分请下载后查看
VTK与Qt整合的示例
1. CMakeLists.txt文件
1.1 用CMake来管理Qt工程
1.2 用CMake来管理Qt与VTK工程
1.3 CMake脚本里增加工程环境变量的加载
2. 用QVTKWidget整合Qt&VTK
2.1 在Qt Designer里集成
2.2 读入一幅图像,并在Qt界面上显示
2.3 用vtkEventQtSlotConnect实现VTK事件与Qt槽的连接
VTK 与 Qt 整合的示例 VTK 附带的程序示例中大多是基于控制台的,作为可视化开发工具包,VTK 也可以与 很多流行的 GUI 开发工具整合,比如 MFC、Qt(题外话:Qt 已经被 Digia 从诺基亚手中收购 了 ,Qt 现 在 的 链 接 是 : http://qt-project.org/ , 也 有 已 经 编 译 好 的 版 本 : http://code.google.com/p/qt-msvc-installer/downloads/list 直接下载安装。可能因为大学课程里 会教授 MFC 的内容,一些非计算机专业的会偏向于采用 MFC,个人觉得,对于非计算机专 业而言,如果一定要选择一种 GUI 工具做开发的话,建议用 Qt,容易上手,学习周期短)、 FLTK(http://www.fltk.org/,FLTK 也是跨平台的,是一种比较轻便的 GUI 工具,VTK 官方发 布版本没有提供对 FLTK 的接口,但可以借助类 vtkFlRenderWindowInteractor,来实现 VTK 与 FLTK 的整合)等等,VTK 的源码目录里(VTK-5.10\Examples\GUI)包含有 VTK 与 Qt、MFC、 Tcl 等工具的整合。考虑到 VTK 对 Qt 的特殊照顾(VTK 提供了很多针对 Qt 的类可以非常方 便地与 Qt 整合),以及 Qt 自身的一些性质(如易用性、跨平台等),我们参考了 VTK 自带的 一些例子,给出了 VTK 与 Qt 整合的详细步骤。 1. CMakeLists.txt 文件 我们已经知道了 VTK 工程的管理是用 CMake 的,而 Qt 自身有 qmake 工具,如果对于 一些小工程而言,单纯的 Qt 程序用 qmake 来构建工程,确实很方便,但如果随着工程复杂 度的增加以及工程依赖其他的函数库时,使用 CMake 来管理工程或许是一个明智的选择。 而且随着你对 CMake 语法的了解,你会发现用 CMake 来管理工程是一件非常棒的事情。 我们先看看对于单纯的 Qt 工程,怎么来写 CMakeLists.txt 脚本文件。 1.1 用 CMake 来管理 Qt 工程 官方对于这个话题给出的解释在这里。我们引用一下这篇博文的图,然后给出每句 CMakeLists.txt 脚本的注释,结合这个图以及脚本的注释,相信你应该能明白了。 1
#---------------------------------------------- # 下面这两行,没什么好解释的 cmake_minimum_required( VERSION 2.8 ) project( YourProjectName ) #---------------------------------------------- # 下面这两行,也没什么好解释的 find_package( Qt4 REQUIRED ) include( ${QT_USE_FILE} ) #---------------------------------------------- # 程序所有源文件。 # 定义变量 Project_SRCS,其值为所列的文件列表 SET( Project_SRCS main.cpp ) #---------------------------------------------- # 程序所有 UI 文件。 # 定义变量 Project_UIS,其值为所列的文件列表 SET( Project_UIS YourQtWindows.ui ) #---------------------------------------------- # 所有包含 Q_OBJECT 的头文件。 # 定义变量 Project_MOC_HDRS,其值为所列的文件列表 SET( Project_MOC_HDRS YourQtProjectFiles.h ) #----------------------------------------------- # 通过 Qt 的 uic.exe 生成 UI 文件对应的 ui_XXXX.h 文件 # 将生成的 ui_XXXX.h 文件放在变量 Project_UIS_H 里, # QT4_WRAP_UI 就是干这个事情。 QT4_WRAP_UI( Project_UIS_H ${Project_UIS} ) #----------------------------------------------- # 通过 Qt 的 moc.exe 生成包含 Q_OBJECT 的头文件对应的 # moc_XXXX.cxx 文件,将生成的 moc_XXXX.cxx 文件放在 # 变量 Project_MOC_SRCS 里。QT4_WRAP_CPP 就是干这个事情。 QT4_WRAP_CPP( Project_MOC_SRCS ${Project_MOC_HDRS} ) #----------------------------------------------- 2
# Qt 的 MOC 和 UIC 程序生成的 moc_XXXX.cxx 和 ui_XXXX.h # 等文件是存放在 CMake 的“Where to build the binaries" # 里指定的目录里,所以必须都这些路径包含进来。 INCLUDE_DIRECTORIES( ${Project_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ) #----------------------------------------------- # Qt 程序如果有资源文件(*.qrc),要包含资源文件, # 然后用 Qt 的 rcc.exe 生成相应的 qrc_XXXX.cpp 文件。 # QT4_ADD_RESOURCES 就是干这个事情。 SET( Project_RCCS YourProject.qrc) QT4_ADD_RESOURCES( Project_RCC_SRCS ${Project_RCCS}) #----------------------------------------------- # 根据程序的 cpp 文件、头文件以及中间生成的 ui_XXXX.h、 # moc_XXXX.cxx、qrc_XXXX.cxx 等生成可执行文件,并链接 # Qt 的动态库(Qt 的动态库都定义在 QT_LIBRARIES 变量里了) ADD_EXECUTABLE( YourProjectName ${Project_SRCS} ${Project_UIS_H} ${Project_MOC_SRCS} ${Project_RCC_SRCS} ) TARGET_LINK_LIBRARIES ( YourProjectName ${QT_LIBRARIES} ) 1.2 用 CMake 来管理 Qt 与 VTK 工程 我们在上面的基础上添加 VTK 相关的 CMake 脚本文件,如下: #---------------------------------------------------------------------------------- cmake_minimum_required( VERSION 2.8 ) project( CombineQtAndVTK ) #---------------------------------------------------------------------------------- find_package( VTK REQUIRED ) find_package( Qt4 REQUIRED ) include( ${VTK_USE_FILE} ) include( ${QT_USE_FILE} ) #---------------------------------------------------------------------------------- SET( PROJECT_SRCS main.cpp 3
ProjectMainWindow.cpp ) SET( PROJECT_UIS ProjectMainWindow.ui ) SET( PROJECT_MOC_HDRS ProjectMainWindow.h ) #---------------------------------------------------------------------------------- QT4_WRAP_UI( PROJECT_UIS_H ${PROJECT_UIS} ) QT4_WRAP_CPP( PROJECT_MOC_SRCS ${PROJECT_MOC_HDRS} ) #---------------------------------------------------------------------------------- INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${VTK_DIR} ) ADD_EXECUTABLE( CombineQtAndVTK ${PROJECT_SRCS} ${PROJECT_UIS_H} ${PROJECT_MOC_SRCS} ) TARGET_LINK_LIBRARIES ( CombineQtAndVTK ${VTK_LIBRARIES} QVTK ) 以上的脚本除了红色字体标注的跟 1.1 注释的不太像之外,其他的都一样,不再解释。 1.3 CMake 脚本里增加工程环境变量的加载 很多非计算机专业的用户在使用 VTK 进行编程时,经常会碰到类似下图所示的一些错 误。 4
碰到这样的错误以后,可能很多用户就不知道怎么处理了,其实上面的提示信息已经写 得非常清楚了,就是缺少“vtkCommon.dll”文件。但是又有人会说:我的电脑里明明有这 个文件存在啊,为什么会找不到呢? 一般的解决方法可能是: 方法一:将缺少的 dll 文件全部拷贝的工程的 Debug 或者 Release 目录下(拷贝的时候要 注意你编译的 VTK 是 Debug 版本的还是 Release 版本的,如果拷错的话,又会出现其他不 可预知的错误了)。但是这个方法是你每建一个工程,运行工程之前得把缺少的动态库文件 又要拷贝过去,如果你不嫌麻烦的话,可以采用。 方法二:将缺少的 dll 文件全部拷贝到 Windows 系统的目录下,即 C:\Windows\system32 或者 C:\Windows\system 目录下,这个方法是你拷贝一次,以后再基于你拷贝的 VTK 动态 库的工程运行的时候问题都解决了。但它同样有一个问题,假如你电脑里的 VTK 升级成别 的版本,重新编译了一份动态库,或者是同时在你电脑里编译了好几个版本的 VTK,这个 时候就有点凌乱了。 为什么这两种方法都可以解决问题?原来动态编译的程序在启动的时候,会搜索程序 所在的目录以及系统环境变量 PATH 所列的目录,如果这些目录有该程序需要的动态库时, 就加载它们,如果没有,就提示无法加载相应动态库的错误。 可以在工程的 CMakeLists.txt 文件里添加一些脚本,把系统的 PATH 环境变量作一些更 改,在工程启动之前加载这些环境变量。也就是(在工程的 CMakeLists.txt 最后添加): #----------------------------------------------------------------------------------- # Construct a list of paths containing runtime directories for project applications on Windows set(PROJECT_RUNTIME_PATH "${VTK_LIBRARY_DIRS}/@VS_BUILD_TYPE@;${CMAKE_RUNTIME_OUTPUT_DIREC TORY}/@VS_BUILD_TYPE@" ) if(QT4_FOUND) set(PROJECT_RUNTIME_PATH "${PROJECT_RUNTIME_PATH};${QT_LIBRARY_DIR}/../bin") endif() include(CreateWindowsBatchScript.cmake) # If we are under Windows, create two batch files which correctly # set up the environment for the application and for Visual Studio if(WIN32) set(VS_SOLUTION_FILE "${PROJECT_BINARY_DIR}/${PROJECT_NAME}.sln") foreach(VS_BUILD_TYPE debug release) CreateWindowsBatchScript("${CMAKE_SOURCE_DIR}/StartVS.bat.in" 5
${PROJECT_BINARY_DIR}/StartVS_${VS_BUILD_TYPE}.bat ${VS_BUILD_TYPE}) endforeach() endif(WIN32) 以上的脚本也不是特别复杂,但提到了两个文件:CreateWindowsBatchScript.cmake 以及 StartVS.bat.in。这两个文件的内容分别是: CreateWindowsBatchScript.cmake: function(CreateWindowsBatchScript in out build_type) if(VTK_DIR) set(VTK_BIN_DIR "${VTK_DIR}/bin/${build_type}") else() set(VTK_BIN_DIR) endif() set(VS_BUILD_TYPE ${build_type}) configure_file(${in} ${out} @ONLY) # substitute again configure_file(${out} ${out} @ONLY) endfunction() StartVS.bat.in: @set CL=/D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE @set LINK=/LARGEADDRESSAWARE PATH=@PROJECT_RUNTIME_PATH@;%PATH% "@VS_SOLUTION_FILE@" 将 工 程 通 过 CMake 的 configure->generate 以 后 , 即 可 生 成 StartVS_debug.bat 和 StartVS_release.bat 两个脚本文件。如果你要编译、运行 Debug 版本的工程,即双击 StartVS_debug.bat 文件打开对应的工程,同理,Release 版本的也一样。一旦按这种方式打 开相应的工程,就不用再担心类似“无法加载***.dll 文件”的错误了。如果你的程序还增 加了 ITK 等函数库,也可以照着上面的脚本作相应的修改。 注意:使用时将 CreateWindowsBatchScript.cmake 和 StartVS.bat.in 两个文件与工程 的 CMakeLists.txt 放在同一级目录里。即类似下图的目录结构: 6
2. 用 QVTKWidget 整合 Qt&VTK Qt 与 VTK 的整合可以使用 VTK 提供的类 QVTKWidget,看这个类名就知道这个类其 实就是一个 Qt 里的 Widget (QVTKWidget 派生自 QWidget),所以可以把它当作普通的 Qt 里的 Widget 来使用,甚至可以在 Qt Designer 里像 Qt 的其他标准控件一样拖来拖去。 2.1 在 Qt Designer 里集成 要实现 QVTKWidget 在 Qt Designer 里像 Qt 的其他标准控件一样拖来拖去,需要把编译 生成的 QVTKWidgetPlugin.dll/QVTKWidgetPlugin.lib(Release 版本)复制到 Qt 的安装目录里 的 plugins\designer 目录下。完了以后,你会在 Qt Designer 里面看到如下的控件: 2.2 读入一幅图像,并在 Qt 界面上显示 接下来,我们来完成一个小功能,就是读入一幅 JPG 图像,然后在 Qt 界面上,用 VTK 来显示。功能非常简单,程序也非常简单。上代码: ProjectMainWindow.h: #ifndef Project_MainWindow_H #define Project_MainWindow_H #include 7
Q_OBJECT ProjectMainWindow(); ~ProjectMainWindow(); //响应打开图像文件的槽函数 void onOpenSlot(); #include "ui_ProjectMainWindow.h" #include class vtkImageViewer2; class vtkRenderer; class ProjectMainWindow : public QMainWindow, public Ui::ProjectMainWindow { public: private slots: private: }; #endif ProjectMainWindow.cpp: #include "ProjectMainWindow.h" #include #include #include #include #include #include #include #include ProjectMainWindow::ProjectMainWindow() { vtkSmartPointer< vtkImageViewer2 > m_pImageViewer; vtkSmartPointer< vtkRenderer > m_pRenderder; setupUi(this); 8
分享到:
收藏