作为一个跨平台的GUI开发工具,Qt的优点在这里不再陈述。VTK提供了大量的类来支持Qt,因此把两者整合是相对比较简单的。
VTK是用CMake进行管理的,而Qt本身提供了qmake来编译Qt工程。对于小型项目,使用qmake管理工程的确比较方便。但是对于大型项目来说,使用CMake来管理工程是一个更加明智的选择。
下面我们将看一下如何使用CMake来管理Qt工程,并如何用QVTKWidget整合Qt和VTK
首先我们来看一下当新建一个demo case并且选择cmake作为编译工具时,Qt帮我们创建的最简单的CMAKELists.txt。
cmake_minimum_required(VERSION 3.5)
project(VTKImbuedQt LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt5 COMPONENTS Widgets REQUIRED)
add_executable(cmakeProject
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
target_link_libraries(cmakeProject PRIVATE Qt5::Widgets)
我们可以看到三行代码将CMAKE_AUTOUIC, CMAKE_AUTOMOC, CMAKE_MOC都设置为on。在解释这三行代码之前, 我们可以看一下cmake编译Qt文件时的流程图。
Qt 依赖于一些代码生成工具,例如生成元对象代码 moc,用于小部件布局代码生成的 uic,以及用于虚拟文件系统内容生成的 rcc工具。
AUTOMOC决定了cmake是否要检测C++文件来决定其是否需要执行MOC命令。如果在头文件中发现了AUTOMAC_MACRO_NAMES的宏(比如说Q_Object),则将对此头文件执行moc命令,并且生成moc_<basename>.cpp的文件。如果宏定义在cpp文件中,则moc将会生成<basename>.moc文件。此<basename>.moc文件必须要被包含在cpp文件中。包含的 moc_*.cpp 和 *.moc 文件将添加在 <AUTOGEN_BUILD_DIR>/include 目录中,该目录自动添加到 INCLUDE_DIRECTORIES。生成的 ui_*.h 文件放置在 <AUTOGEN_BUILD_DIR>/include 目录中,该目录会自动添加到 INCLUDE_DIRECTORIES。
AUTOUIC决定了cmake是否要检测C++文件来决定其是否需要执行uic命令。如果c++的预处理指令#include 包含了ui_<basename>.h并且<basename>.ui文件存在,则uic命令将作用到具体的ui文件上。
AUTORCC可以将*.qrc资源文件转化为qrc_*.cpp文件,以供后续编译使用。
在add_executable命令调用时,需要我们将SRC,header和UI文件以及qrc资源文件显式声明。
参考:《VTK图形图像开发进阶》张晓东 罗火灵编著
cmake-qt(7) — CMake 3.22.1 Documentationhttps://cmake.org/cmake/help/latest/manual/cmake-qt.7.html