CMake 构建 Qt 应用的若干问题
2024-08-01 22:50:37

指定 Qt 路径

构建时要通过 CMAKE_PREFIX_PATH 指定 Qt 的安装路径,这样应用才能搜索到相关头文件,比如:

1
cmake -DCMAKE_PREFIX_PATH="C:/Qt/Qt5.7.1-vc141-x64"

将 .qm 文件添加到 .qrc 中

在开发国际化应用程序时,我们可以将语言文件(.qm)放在磁盘上,也可以考虑放在资源文件中,这样可以避免文件被误删,或被用户胡搞。
资源文件内容可以这样写:

1
2
3
4
5
6
<RCC>
<qresource prefix="/i18n">
<file>zh_CN.qm</file>
<file>ja_JP.qm</file>
</qresource>
</RCC>

但这里有个问题,.qm文件是从.ts文件编译后才得到的,那么如何在编译后将其写入.qrc资源文件中呢?
这里得先说说 qt5_create_translation 函数,这个函数会调用lupdate.exe工具并生成.qm文件到构建目录下。
那么我们可以单独创建一个i18n.qrc文件作为模板,并复制到构建目录中,让它和.qm文件在同一个位置不就行了吗!

1
2
3
4
5
6
7
8
9
10
11
12
# 构建 .qm 文件
file(GLOB TS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/languages/*.ts)
qt5_create_translation(_ ${CMAKE_CURRENT_SOURCE_DIR}/src ${TS_FILES})

# 复制资源文件模板到构建目录下
set(i18n_qrc "i18n.qrc")
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/${i18n_qrc} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

# 添加资源文件
qt5_add_resources(RESOURCE_FILES ${CMAKE_CURRENT_BINARY_DIR}/${i18n_qrc})

target_sources(demo PRIVATE ${RESOURCE_FILES})

完美!

编辑 .ui 文件后如何立即更新

在 CMake 中有一个 CMAKE_AUTOUIC 变量,控制是否自动调用uic.exe来更新ui_*.h文件。
但问题在于 CMake 在编辑.ui文件后的第一次运行无法感知到头文件的变化(会显示旧的界面),必须要构建第二次才会 rebuild 相关的源文件,这样才能看到修改后的界面,至于为什么会这样我也不清楚。
研究了一番后发现用手动生成 UI 头文件可以解决这个问题,CMake 大概是这样:

1
2
3
4
5
6
7
8
9
10
# 关闭,不要自动 uic
set(CMAKE_AUTOUIC OFF)

file(GLOB UI_FILES src/*.ui)
qt5_wrap_ui(UI_HEADERS ${UI_FILES})
target_include_directories(demo PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>)

# 要将文件添加到源中,这样才会 rebuild
target_sources(demo PRIVATE ${UI_HEADERS}
)

这里的关键就在 qt5_wrap_ui 函数,这是手动生成ui_*.h文件的方法。这种方式生成后可以立即引起 rebuild,这样启动程序后就是最新的界面。

相关阅读

How to Integrate Qt4 qm files into binary using cmake and QRC?