Qt中qt_add_translations两种写法异常:变体2未嵌入翻译资源
Qt翻译资源加载失败问题:
qt_add_translations拆分写法不生效 我创建了测试项目复现问题:根据Qt官方文档,qt_add_translations的两种写法应大致等效,但使用qt_add_lupdate、qt_add_lrelease、qt_add_resources组合配置时,翻译文件未被正确打包进可执行文件,导致加载失败。
CMake配置代码
cmake_minimum_required(VERSION 3.27) set(CMAKE_CXX_STANDARD 23) project(TestQtWidgetsProject) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) # Executable add_executable(${PROJECT_NAME} main.cpp) # Library find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) target_link_libraries(${PROJECT_NAME} Qt::Core Qt::Gui Qt::Widgets) # Translations find_package(Qt6 REQUIRED LinguistTools) # ======================================= # Variant 1 #qt_add_translations(TestQtWidgetsProject # INCLUDE_DIRECTORIES # ${PROJECT_SOURCE_DIR} # TS_FILES # translation_ru.ts) # Variant 2 qt_add_lupdate(${PROJECT_NAME} INCLUDE_DIRECTORIES ${PROJECT_SOURCE_DIR} TS_FILES translation_ru.ts) qt_add_lrelease(${PROJECT_NAME} TS_FILES translation_ru.ts QM_FILES_OUTPUT_VARIABLE QM_FILES) qt_add_resources(${PROJECT_NAME} "translations" PREFIX "/i18n" FILES ${QM_FILES}) # ======================================= # Dependencies add_dependencies(${PROJECT_NAME} ${PROJECT_NAME}_lupdate) add_dependencies(${PROJECT_NAME} ${PROJECT_NAME}_lrelease)
main.cpp代码
#include <QApplication> #include <QPushButton> #include <QTranslator> int main(int argc, char* argv[]) { QApplication a(argc, argv); QTranslator translator; qDebug() << translator.load(":/i18n/translation_ru"); qDebug() << QApplication::installTranslator(&translator); QPushButton button(QApplication::tr("Hello, World!") + QApplication::tr(" qwe"), nullptr); button.resize(200, 100); button.show(); return QApplication::exec(); }
运行结果
- 使用变体1时输出:
true true
- 使用变体2时输出:
false false
问题原因及解决方法
问题核心在于QM_FILES是qt_add_lrelease生成的目标级变量,CMake配置阶段它还没有实际文件路径值,导致qt_add_resources无法识别待打包的QM文件;同时qt_add_lrelease默认将QM文件生成到构建目录,配置阶段CMake找不到这些未生成的文件,资源编译器自然不会打包。
修复方案
方案1:固定QM文件输出路径
给qt_add_lrelease指定OUTPUT_LOCATION,让QM文件生成到源码目录,确保CMake能识别到:
qt_add_lrelease(${PROJECT_NAME} TS_FILES translation_ru.ts QM_FILES_OUTPUT_VARIABLE QM_FILES OUTPUT_LOCATION ${PROJECT_SOURCE_DIR} ) qt_add_resources(${PROJECT_NAME} "translations" PREFIX "/i18n" FILES ${QM_FILES})
方案2:通过模板生成qrc文件
创建模板文件translations.qrc.in:
<RCC> <qresource prefix="/i18n"> @QM_FILES@ </qresource> </RCC>
在CMake中通过configure_file生成实际qrc文件,延迟处理QM文件路径:
qt_add_lupdate(${PROJECT_NAME} INCLUDE_DIRECTORIES ${PROJECT_SOURCE_DIR} TS_FILES translation_ru.ts) qt_add_lrelease(${PROJECT_NAME} TS_FILES translation_ru.ts QM_FILES_OUTPUT_VARIABLE QM_FILES) # 生成qrc文件 configure_file(translations.qrc.in ${PROJECT_BINARY_DIR}/translations.qrc @ONLY) # 添加资源 qt_add_resources(${PROJECT_NAME} "translations" FILES ${PROJECT_BINARY_DIR}/translations.qrc)
另外,add_dependencies无需手动添加,qt_add_lupdate和qt_add_lrelease已自动设置目标依赖,保留也不影响。修改后变体2即可像变体1一样正确打包翻译文件,加载返回true。
内容的提问来源于stack exchange,提问作者AvidCoder
相关产品推荐
相关产品推荐

