Qt CMake开发
众所周知,Qt有着自己的构建系统——QMake,但是在Qt6,Qt官方更推荐使用CMake作为项目的构建工具,并且CMake在跨平台方面支持的比较好,大多数IDE也能够支持CMake。在QMake迁移到CMake的过程中,有些同学可能会不知从何下手。所以本文简单的介绍一下:如何使用CMake来开发Qt软件。
文中介绍的方法均只在Windows下验证过。
Qt模块的引入
对于Qt中的不同模块,其实也就是引入不同的库,所以,大致流程和引入库的基本一致。根据Qt官方提供的示例,引入一个模块主要有几个步骤:
- 为了让CMake能够找到Qt的模块,需要设置环境变量
CMAKE_PREFIX_PATH
- 使用
find_package
命令,来寻找Qt的库。命令具体描述参考官方文档。 - 使用
target_link_libraries
将库链接至当前目标。
以下以Qt6为例
set(QT_DIR "D:/xxx/Qt/6.6.1/msvc2019_64/lib")
# 使用list,临时在环境变量CMAKE_PREFIX_PATH中加入QT_DIR
list(APPEND CMAKE_PREFIX_PATH ${QT_DIR})
find_package(Qt6 REQUIRED COMPONENTS Core Widgets Gui)
target_link_libraries("target_name" Qt6::Core Qt6::Widgets Qt6::Gui)
资源文件(qrc)
CMAKE_AUTORCC
话不多说,直接说解决方案:
set(CMAKE_AUTORCC ON)
set(OTHER_FILES main.cpp)
# 添加将资源文件
add_executable(${PROJECT_NAME} ${OTHER_FILES} xxx.qrc)
其他加载资源文件的方式
像上面的这种方法,会将资源文件编译到exe里面,会导致软件的大小,“看起来”比较大。并且也不能像动态库一样,在不重新编译软件的情况下,进行资源的替换。幸运的是,Qt提供了一套注册资源的方法,支持在运行时加载和卸载资源。函数原型为:
[static] bool
QResource::registerResource(const QString &rccFileName,
const QString &mapRoot = QString())
[static] bool
QResource::unregisterResource(const QString &rccFileName,
const QString &mapRoot = QString())
具体文档描述,可参看Qt在线文档:registerResource、unregisterResource
第一个参数为rccFileName
,也就是说需要加载的是rcc而非qrc,但是rcc是二进制文件,而我们创建和编辑的都是qrc文件,那怎么将qrc文件转换成rcc文件呢?
这里就要用到qt自带的rcc工具:rcc.exe,具体的命令为:
rcc.exe xxx.qrc --binary xxx.rcc
最终,加载资源的步骤为:
- 调用qt的rcc工具,将qrc编译成二进制rcc文件。
- 在软件运行时,调用
QResource::registerResource
,加载到指定的rcc文件。
如需卸载资源文件,Qt也提供一个API用来卸载资源QResource::unregisterResource
,通过这种方法,即可在软件运行期间,实现资源文件的加载和卸载。
UI文件
对于UI文件,想要加载到项目中,主要有两个步骤:
- 设置
CMAKE_AUTOUIC
为ON
- 使用
add_executable
,将UI文件加入编译中,命令详细介绍参看官方文档。
具体CMake命令如下:
set(CMAKE_AUTOUIC ON)
add_executable (XXX "test.ui")
MOC文件
同样,对于Qt中的moc处理,CMake也提供了很方便的处理方式:
set(CMAKE_AUTOMOC ON)
参考链接
在写这篇博客的过程中,也是笔者自己查漏补缺的过程,主要参考了下面几篇文章,感谢!