qt_standard_project_setup

qt_standard_project_setup的更先进的国际化。

这个camke命令的官方说明是:项目范围默认标准设置。

该命令在Qt6包的Core组件中定义,可以像这样加载:

Matlab 复制代码
 find_package(Qt6 REQUIRED COMPONENTS Core)
  • 这个命令是在Qt 6.3中引入的
Matlab 复制代码
qt_standard_project_setup(
     [REQUIRES <version>]
     [SUPPORTS_UP_TO <version>]
     [I18N_TRANSLATED_LANGUAGES <language...>]
     [I18N_SOURCE_LANGUAGE <language>]
 )

该命令简化了设置典型Qt应用程序的任务。通常在第一次find_package(Qt6)调用之后立即调用,通常在顶级CMakeLists.txt文件中,并且在定义任何目标之前。

它可以完成以下工作:

qt_standard_project_setup()命令将CMake的一些变量设置为true,如果它们尚未定义。这将默认启用当前目录范围及其子目录中随后创建的目标的所有与Qt相关的自动生成特性。 CMake会自动包含GNUInstallDirs模块。这会为诸如CMAKE_INSTALL_BINDIR、CMAKE_INSTALL_LIBDIR等变量定义适当的默认值。 在针对Windows时,如果CMAKE_RUNTIME_OUTPUT_DIRECTORY变量尚未设置,它将被设置为${CMAKE_CURRENT_BINARY_DIR}。 针对苹果或Windows之外的目标平台,CMAKE_INSTALL_RPATH将按照以下描述进行扩展。 CMake的USE_FOLDERS属性被设置为ON,而QT_TARGETS_FOLDER被设置为QtInternalTargets。支持文件夹的集成开发环境将在此文件夹中显示Qt内部目标。

自Qt 6.5以来,可以通过选择接受来自更新的Qt版本的更改来更改Qt的CMake API的默认行为。如果指定了REQUIRES,将启用Qt引入的所有建议更改,直到REQUIRES,并且使用较旧的Qt版本将导致错误。如果另外指定了SUPPORTS_UP_TO,还将启用在SUPPORTS_UP_TO版本中引入的任何新更改(但是使用较旧的Qt版本不会导致错误)。这类似于CMake的策略概念(请参阅cmake_policy)。 在支持RPATH的平台上(除了苹果平台),此命令将向CMAKE_INSTALL_RPATH变量附加两个值。附加ORIGIN以便库能够在与自身相同目录中找到其依赖的其他库。还附加ORIGIN/<reldir>,其中<reldir>是从CMAKE_INSTALL_BINDIR到CMAKE_INSTALL_LIBDIR的相对路径。这允许安装到CMAKE_INSTALL_BINDIR的可执行文件找到任何安装到CMAKE_INSTALL_LIBDIR的可能依赖的库。CMAKE_INSTALL_RPATH中的任何重复项都将被移除。在实践中,这两个值确保可执行文件和库能够找到它们的链接时依赖项,假设项目将它们安装到install(TARGETS)命令在没有明确提供目标时使用的默认位置。 要禁用集成开发环境的文件夹支持,请在调用qt_standard_project_setup之前或之后将USE_FOLDERS设置为OFF。 通过将QT_NO_STANDARD_PROJECT_SETUP变量设置为true,可以有效地禁用qt_standard_project_setup()命令。

重点来了:

  • 自Qt 6.7以来,可以使用I18N_TRANSLATED_LANGUAGES参数指定用于项目国际化的语言。参见QT_I18N_TRANSLATED_LANGUAGES了解详细信息。 使用I18N_SOURCE_LANGUAGE指定编写可翻译字符串所用的语言。缺省情况下,使用"en"。详细信息请参见QT_I18N_SOURCE_LANGUAGE。
Matlab 复制代码
qt_standard_project_setup(REQUIRES 6.5 I18N_TRANSLATED_LANGUAGES en en_AU fr)

解释:需要版本至少6.5(这里来自于QT官方的一个例子,我是用的版本是6.7),加载QT_I18N_SOURCE_LANGUAGE,需要翻译的.ts有en、en_AU、fr如果你想增加中文翻译,只需要在指定的目录加上zh_CN.ts,然后将命令修改为:

Matlab 复制代码
qt_standard_project_setup(REQUIRES 6.5 I18N_TRANSLATED_LANGUAGES en en_AU fr zh_CN)

系统将自动生成对应的.pm文件,然后根据用户所在环境自动的执行国际化。

不用向以前if else判断了,也不需要添加资源,不需要手动生成.qm文件

以下代码也不需要了:

Matlab 复制代码
    QTranslator translator;
    const QStringList uiLanguages = QLocale::system().uiLanguages();
    for (const QString &locale : uiLanguages) {
        const QString baseName = "untitled_" + QLocale(locale).name();
        if (translator.load(":/projct_/" + baseName)) {
            a.installTranslator(&translator);
            break;
        }
    }

一气呵成。

该条语句示例存在于官方项目:qml-i18n 中,有兴趣的小伙伴可以自行实践。

配合

qt_add_translations(untitled
    RESOURCE_PREFIX /i18n
    TS_FILE_BASE untitled
    TS_FILE_DIR i18n
)

生成前缀untitled_的.ts文件

QT6.7以前此命令只接受第一个参数作为"target"。"target"用于提取可翻译源和嵌入 .qm 文件。

QT6.7以后第一个参数"target"不再用于源提取。

相关推荐
vvvae12341 小时前
分布式数据库
数据库
雪域迷影2 小时前
PostgreSQL Docker Error – 5432: 地址已被占用
数据库·docker·postgresql
bug菌¹3 小时前
滚雪球学Oracle[4.2讲]:PL/SQL基础语法
数据库·oracle
威桑3 小时前
记一次控件提升后,运行却不显示的Bug
qt
逸巽散人3 小时前
SQL基础教程
数据库·sql·oracle
月空MoonSky3 小时前
Oracle中TRUNC()函数详解
数据库·sql·oracle
momo小菜pa3 小时前
【MySQL 06】表的增删查改
数据库·mysql
FL16238631294 小时前
[深度学习][python]yolov11+bytetrack+pyqt5实现目标追踪
深度学习·qt·yolo
向上的车轮4 小时前
Django学习笔记二:数据库操作详解
数据库·django
编程老船长4 小时前
第26章 Java操作Mongodb实现数据持久化
数据库·后端·mongodb