Qt-Cmake

本文最后更新于 2024年9月18日 晚上

使用I18N国际化支持

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# set是可以用前面的标识来表示后面的数据,可以类比一下c的define
set(QT_VERSION 5)
set(REQUIRED_LIBS Core Gui Widgets)
set(REQUIRED_LIBS_QUALIFIED Qt5::Core Qt5::Gui Qt5::Widgets)
# 填lupdate和lrelease的路径
set(LUPDATE_PATH "E:/Qt/5.15.2/msvc2019_64/bin/lupdate.exe")
set(LRELEASE_PATH "E:/Qt/5.15.2/msvc2019_64/bin/lrelease.exe")
set(TS_FILES
${CMAKE_SOURCE_DIR}/lang/zh_CN.ts
${CMAKE_SOURCE_DIR}/lang/ja_JP.ts)
# 这里不使用LinguistTools
find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} REQUIRED)
# 创建生成ts文件和qm文件的目标
# ALL指定加入make all
add_custom_target(update_all_ts_files ALL)
add_custom_target(create_all_qm_files ALL)
# 对每一个ts文件进行操作
foreach(TS_FILE ${TS_FILES})
# 把zh_CN.ts中的zh_CN提取出来
get_filename_component(I18N_NAME ${TS_FILE} NAME_WE)
set(TS_TARGET_NAME "update_ts_file_${I18N_NAME}")
add_custom_target(${TS_TARGET_NAME}
COMMAND ${LUPDATE_PATH} ${CMAKE_CURRENT_SOURCE_DIR} -ts ${TS_FILE}
VERBATIM)
# 将update_ts_file_<NAME>添加为update_all_ts_files的依赖,下同
add_dependencies(update_all_ts_files ${TS_TARGET_NAME})
set(QM_TARGET_NAME "create_qm_file_${I18N_NAME}")
set(QM_FILE "${CMAKE_CURRENT_BINARY_DIR}/${I18N_NAME}.qm")
add_custom_target(${QM_TARGET_NAME}
COMMAND ${LRELEASE_PATH} ${TS_FILE} -qm ${QM_FILE}
VERBATIM)
# 因为得先有ts文件才能生成qm文件,所以把构建ts文件的目标作为自己的依赖
add_dependencies(${QM_TARGET_NAME} ${TS_TARGET_NAME})
add_dependencies(create_all_qm_files ${QM_TARGET_NAME})
endforeach()
# 将.qrc文件拷贝到编译目录
configure_file(translations.qrc ${CMAKE_CURRENT_BINARY_DIR} COPYONLY)

add_executable(${PROJECT_NAME} main.cpp ${CMAKE_CURRENT_BINARY_DIR}/translations.qrc)
# 因为qrc依赖qm文件,所以需要先让qm文件创建完成
add_dependencies(${PROJECT_NAME} create_all_qm_files)

这里的translations.qrc代码格式如下(也可使用rcc自动生成):

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

以上代码可以更改lupdate和lrelease的路径后直接使用。

1
2
3
add_executable(\${PROJECT_NAME} main.cpp\${CMAKE_CURRENT_BINARY_DIR}/translations.qrc)
# 将上面代码改为下面代码可以去掉运行时的命令行
add_executable(\${PROJECT_NAME} WIN32 main.cpp\${CMAKE_CURRENT_BINARY_DIR}/translations.qrc)

qt中的使用:

1
2
3
4
QTranslator trans;  
if (trans.load(":/ja_JP.qm")) {
QCoreApplication::installTranslator(&trans);
}

也可以使用QT自带的翻译: 在Qt的安装目录 C:\Qt\Qt5.7.0VS2015\5.7\msvc2015\translations 中有名为qt_zh_CN.qm翻译文件,QLineEdit等通过加载该翻译文件就能实现右键中文菜单,如下所示:

QApplication a(argc, argv);
 
//加载Qt中的资源文件,使Qt显示中文(包括QMessageBox、QLineEdit右键菜单等)
 

1
2
QTranslator translator;	  translator.load(":/translations/qt_zh_CN.qm");
a.installTranslator(&translator);

这个图很好地解释了使用qrc来实现实际上是将资源直接集成到exe中了,这里提供用rcc的外部动态库

add_coustom_command使用

1
2
3
4
5
6
7
8
9
10
11
12
add_custom_command(OUTPUT ${TEST_FILE}

COMMAND touch ${TEST_FILE}

# Display the given message before the commands are executed at build time

COMMENT "Creating ${TEST_FILE}"

# to make quotes printable,for example

VERBATIM
)

Qt-Cmake
http://example.com/posts/11281/
作者
晓寒
发布于
2023年4月24日
许可协议