友好的用户图形界面是应用程序必须的因素之一,对于VTK应用程序也是如此。VTK附带的程序示例大多数是基于控制台的,但是VTK也可以与很多流行的GUI开发工具整合。本文介绍如何把VTK(7.1.0)和GUI开发工具Qt(5.x)进行整合。
VTK之基于Qt的VTK应用程序
Qt是跨平台的GUI开发工具,VTK也提供了大量的类支持Qt。VTK工程是用CMake进行管理的,而Qt自身有qmake工具。对于一些规模较小的Qt工程而言,用qmake来构建工程确实很方便,但是随着工程复杂度的增加或者当所开发的工程依赖于其他函数库时,使用CMake来管理工程是一个明智的选择。
用CMake管理Qt工程
下图是Qt编译系统:
用CMake来管理 Qt工程的CMakeLists脚本程序:
#----------------------------------------------
# 下面这两行,没什么好解释的
cmake_minimum_required( VERSION 2.8 )
project( YourProjectName )
#----------------------------------------------
# 下面这两行,也没什么好解释的
find_package( Qt5Widgets REQUIRED )
include( ${QT_USE_FILE} )
#----------------------------------------------
# 程序所有源文件。<TODO:在此处添加源文件>
# 定义变量Project_SRCS,其值为所列的文件列表
SET( Project_SRCS
main.cpp
)
#----------------------------------------------
# 程序所有UI文件。<TODO:在此处添加UI文件>
# 定义变量Project_UIS,其值为所列的文件列表
SET( Project_UIS
YourQtWindows.ui
)
#----------------------------------------------
# 所有包含Q_OBJECT的头文件。<TODO:在此处添加头文件>
# 定义变量Project_MOC_HDRS,其值为所列的文件列表
SET( Project_MOC_HDRS
YourQtProjectFiles.h
)
#-----------------------------------------------
# 通过Qt的uic.exe生成UI文件对应的ui_XXXX.h文件
# 将生成的ui_XXXX.h文件放在变量Project_UIS_H里,
# QT5_WRAP_UI就是干这个事情。
QT5_WRAP_UI( Project_UIS_H ${Project_UIS} )
#-----------------------------------------------
# 通过Qt的moc.exe生成包含Q_OBJECT的头文件对应的
# moc_XXXX.cxx文件,将生成的moc_XXXX.cxx文件放在
# 变量Project_MOC_SRCS里。QT5_WRAP_CPP就是干这个事情。
QT5_WRAP_CPP( Project_MOC_SRCS ${Project_MOC_HDRS} )
#-----------------------------------------------
# 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文件。
# QT5_ADD_RESOURCES就是干这个事情。
SET( Project_RCCS YourProject.qrc)
QT5_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 ${Qt5Widgets_LIBRARIES} )
在Qt Designer里继承QVTKWidget控件
要实现QVTKWidget在Qt Designer里像Qt的其他标准控件的拖拽功能,需要将VTK中编译(必须是Release)生成的QVTKWidgetPlugin.dll和QVTKWidgetPlugin.lib复制到Qt安装目录中的plugins\designer下。复制完成后,Qt Designer界面如下图所示。
示例演示
本例先用Qt Designer生成ui文件,再整合VTK生成CT数据浏览器。
CMakeLists.txt代码
CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )
PROJECT( Qt )
#----------------------------------------------------------------------------------
FIND_PACKAGE( VTK REQUIRED )
FIND_PACKAGE( Qt5Widgets REQUIRED )
INCLUDE( ${VTK_USE_FILE} )
#----------------------------------------------------------------------------------
SET( PROJECT_SRCS
main.cpp
ProjectMainWindow.cpp
)
SET( PROJECT_UIS
ProjectMainWindow.ui
)
SET( PROJECT_MOC_HDRS
ProjectMainWindow.h
)
#----------------------------------------------------------------------------------
QT5_WRAP_UI( PROJECT_UIS_H
${PROJECT_UIS}
)
QT5_WRAP_CPP( PROJECT_MOC_SRCS
${PROJECT_MOC_HDRS}
)
#----------------------------------------------------------------------------------
INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${VTK_DIR}
)
ADD_EXECUTABLE( Qt
${PROJECT_SRCS}
${PROJECT_UIS_H}
${PROJECT_MOC_SRCS}
)
TARGET_LINK_LIBRARIES ( Qt
${VTK_LIBRARIES}
${Qt5Widgets_LIBRARIES}
)
#-----------------------------------------------------------------------------------------------------------------------------------
# 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_DIRECTORY}/@VS_BUILD_TYPE@"
)
IF(QT5_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"
${PROJECT_BINARY_DIR}/StartVS_${VS_BUILD_TYPE}.bat
${VS_BUILD_TYPE})
ENDFOREACH()
ENDIF(WIN32)
运行结果:
源代码下载,下载后用CMake编译一下即可运行。
测试数据:链接:https://pan.baidu.com/s/1R6fax_CuMM6PMeRgiXWNXA 提取码:abii
版权声明:本文为webzhuce原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。