qt_target_qml_sources

该命令在 Qt 6.2 中引入。

简介

qt_target_qml_sources(
    target
    [QML_FILES ...]
    [RESOURCES ...]
    [PREFIX resource_path]
    [OUTPUT_TARGETS out_targets_var]
    [NO_LINT]
    [NO_CACHEGEN]
    [NO_QMLDIR_TYPES]
)

如果禁用了无版本命令,请使用qt6_target_qml_sources() 代替。它支持与本命令相同的参数集。

说明

注意: 此命令需要 CMake 3.19 或更高版本。

qt_target_qml_sources() 提供了在调用qt_add_qml_module()之后向 QML 模块添加更多文件的功能。通常,你会直接把 文件和资源的集合传递给.qml qt_add_qml_module(),但在某些情况下,在调用qt_add_qml_module()后添加文件可能是可取的,甚至是必要的。例如,您可能希望根据 语句表达式有条件地添加文件,或者从子目录中添加文件,只有在满足特定条件时才会添加文件。您可能希望添加一组与其他文件具有不同特性的文件,如不同的资源前缀,或禁用了词inting 和字节码编译。 命令可以实现这些功能。if qt_target_qml_sources()

参数

target 必须是 QML 模块的后盾目标,如果 QML 模块没有单独的后盾目标,则必须是模块的插件目标。

QML_FILES 是要添加到 QML 模块的 、 和 文件列表。该选项与.qml .js .mjs qt_add_qml_module()命令的 选项效果完全相同,包括自动编译为字节码和 lint 处理。QML_FILES

NO_CACHEGENNO_LINT 选项的作用也与qt_add_qml_module() 相同。它们会禁用QML_FILES 所列文件的字节码编译和 lint 处理。也可以使用源文件属性为单个文件指定这种行为。

NO_QMLDIR_TYPES 防止 作为类型添加到生成的QML_FILES qmldir文件中。

RESOURCESqt_add_qml_module()命令的 选项效果完全相同。它提供了一个要作为普通资源添加到 的文件列表。这些文件通常是 QML 代码以某种方式引用的图片、着色器等。RESOURCES target

通过QML_FILESRESOURCES 添加到模块的文件将被放置在相同的资源前缀和目标路径下,就像通过qt_add_qml_module()命令添加一样。这可以通过PREFIX 选项提供不同的位置来覆盖。PREFIX 关键字后面的值将被直接使用,而不附加任何目标路径。每个文件的最终资源路径将是前缀,加上CMAKE_CURRENT_SOURCE_DIR 下面的文件路径。QT_RESOURCE_ALIAS源文件属性也可用于覆盖该相对路径。

qt_add_qml_module(backing
    URI Example
    VERSION 1.0
    RESOURCE_PREFIX /my.company.com/imports
)

qt_target_qml_sources(backing
    QML_FILES special/First.qml
    RESOURCES icons/logo.png
)

qt_target_qml_sources(backing
    PREFIX /other.company.com/debugging
    QML_FILES Inspector.qml
)

在上例中,backing 目标机的资源最终将包含以下内容:

  • /my.company.com/imports/Example/special/First.qml
  • /my.company.com/imports/Example/icons/logo.png
  • /other.company.com/debugging/Inspector.qml

OUTPUT_TARGETSqt_add_qml_module() 的选项类似。使用它可以指定一个变量的名称,用于存储为静态编译创建的任何其他目标。如果 将被安装,则这些附加目标也需要安装,以满足链接要求。target

源文件属性

源文件属性(Source File Properties)可用于影响在 QML 模块处理过程中如何处理每个.qml 文件。这些属性会覆盖调用qt_target_qml_sources()qt_add_qml_module() 时指定的任何高级选项。所有这些属性都需要在使用这两个命令中的任何一个添加文件之前设置。

QT_QML_SKIP_QMLLINT 可以在源文件上将qt_add_qml_module() 设置为 ,以防止其被纳入TRUE 自动 qmllint 处理。默认情况下,所有 文件都将包含在目标的 lint 运行中,但也可以使用此选项来排除特定文件。.qml

QT_QML_SKIP_CACHEGEN 与此类似,当该属性设置为 时,源文件不会被编译为字节码。注意,该文件仍会以未编译的形式作为资源添加到 (请参阅TRUE target 缓存已编译的 QML 源文件)。

QT_QML_SKIP_QMLDIR_ENTRY 源文件属性设为TRUE ,可防止 QML 或 JavaScript 文件作为类型添加到 QML 模块的qmldir 文件(请参阅自动生成qmldir 和 typeinfo 文件)。这通常用于不公开类型的文件,如私有 JavaScript 文件。对于名称为大写字母的 JavaScript 文件,如果它们既不是 ECMAScript 模块,也未通过.pragma library 声明为无状态库,则应考虑使用此选项。如果你把它们包含在qmldir 文件中,它们会在每个显式或隐式导入它们所属模块的 QML 文档的作用域中被重新评估。

默认情况下,生成qmldir 文件时,将为每个提供类型的.qml 文件生成一个单一的类型条目。它的版本号是X.0 ,其中X 是 QML 模块的主要版本。如果 QML 模块有任何PAST_MAJOR_VERSIONS 设置,同样的模式也将应用于这些设置,并为每个过去的主要版本添加X.0 X 。如果文件需要提供不同版本的类型条目(例如,它是在.0 发布后的次要补丁版本中首次添加的),请在源文件的QT_QML_SOURCE_VERSIONS 属性中指定这些版本。每个版本将创建一个类型条目。

如果.qml 文件提供的类型是单例,则应将其QT_QML_SINGLETON_TYPE 属性设置为TRUE 。同样,文件的QT_QML_INTERNAL_TYPE 源属性也可设置为TRUE ,以表示其提供的类型是内部类型。类型本身的名称也可以使用QT_QML_SOURCE_TYPENAME 属性重写。所有这三个属性都将反映在生成的qmldir 文件中的文件类型条目中。源属性必须在创建单例所属模块之前设置。

所有以QML_FILESRESOURCES 列出的文件都将添加到target 的资源中。它们在资源中的位置由基点和相对路径组成。基点默认为 QML 模块的资源前缀和目标路径的连接,但可以用PREFIX参数覆盖。相对路径默认为与targetSOURCE_DIR target 属性相对的文件路径。可以通过设置源文件的QT_RESOURCE_ALIAS 属性来覆盖该相对路径。这通常用于收集来自不同目录的文件,并将它们显示在资源的共同位置下。不过,自 Qt 6.8 起,如果目标是 QML 模块的所有文件都能在隐式导入中找到,启用QTP0004通常是更好的选择。在仍需手动设置的情况下,建议将NO_GENERATE_EXTRA_QMLDIRS 发送至qt_add_qml_module ,因为额外的 qmldirs 不会考虑资源文件别名。

set_source_files_properties(nested/way/down/File.qml PROPERTIES
    QT_RESOURCE_ALIAS File.qml
)
set_source_files_properties(TemplateFile.qml PROPERTIES
    QT_RESOURCE_ALIAS templates/File.qml
    QT_QML_SKIP_QMLDIR_ENTRY TRUE
    QT_QML_SKIP_QMLLINT TRUE
    QT_QML_SKIP_CACHEGEN TRUE
)
set_source_files_properties(FunnySingleton.qml PROPERTIES
    QT_QML_SINGLETON_TYPE TRUE
)
qt_add_qml_module(qt_target_qml_sources_example
    URI Example
    VERSION 2.3
    RESOURCE_PREFIX /my.company.com/imports
    NO_GENERATE_EXTRA_QMLDIRS
    QML_FILES
        nested/way/down/File.qml
        TemplateFile.qml
        FunnySingleton.qml
)

set_source_files_properties(some_old_thing.qml PROPERTIES
    QT_QML_SOURCE_VERSIONS "1.1;2.0"
    QT_QML_SOURCE_TYPENAME OldThing
)
set_source_files_properties(../../../images/button-types.png PROPERTIES
    QT_RESOURCE_ALIAS button-types.png
)
qt_target_qml_sources(qt_target_qml_sources_example
    QML_FILES some_old_thing.qml
    RESOURCES
        ../../../images/button-types.png
        doc/README.txt
)

在上例中,qt_target_qml_sources_example 目标的资源最终将包含以下内容:

  • /my.company.com/imports/Example/File.qml
  • /my.company.com/imports/Example/FunnySingleton.qml
  • /my.company.com/imports/Example/templates/File.qml
  • /my.company.com/imports/Example/some_old_thing.qml
  • /my.company.com/imports/Example/button-types.png
  • /my.company.com/imports/Example/doc/README.txt

生成的qmldir 文件将包含以下类型条目:

File 2.0 File.qml
singleton FunnySingleton 2.0 FunnySingleton.qml
OldThing 1.1 some_old_thing.qml
OldThing 2.0 some_old_thing.qml

注意: 源 FunnySingleton.qml 文件必须已包含pragma Singleton 语句。设置QT_QML_SINGLETON_TYPE 源属性不会自动生成 pragma。

pragma Singleton
import QtQml

QtObject {}

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.