QTP0005
允许qt_add_qml_module() 依赖关键字接受CMake目标。
该策略于 Qt 6.8 中引入。它允许通过DEPENDENCIES 、IMPORTS 、OPTIONAL_IMPORTS 和DEFAULT_IMPORTS 关键字将 CMake 目标传递给qt_add_qml_module()。
启用此策略意味着传递给这些关键字的参数可以添加前缀TARGET ,随后将被视为 CMake 目标名称。QML 模块的 URI 和导入路径将自动从该目标中推导出来。
该策略的OLD 行为是:将令牌序列TARGET name 视为两个独立的 URI,即TARGET 和name 。
该策略在NEW 模式下的行为是:将TARGET 视为关键字。URI 将从随后的 QML 模块目标中提取。如果TARGET 后的名称未指向现有目标,或者该目标不对应于 QML 模块,则会引发硬错误。
无论采用NEW 还是OLD 的行为,均可通过在末尾添加斜杠和版本号来指定模块版本。更多详细信息请参阅“声明模块依赖关系”。
背景
在此策略实施之前,QML 模块依赖项必须通过其字符串 URI 进行声明,例如QtQuick 或com.example.mymodule 。这意味着依赖项的 URI 以及(如有需要)导入路径必须与提供该模块的 CMake 目标保持一致。
采用NEW 的行为方式后,您可以改用 CMake 目标名称来引用依赖项。构建系统会自动根据该目标确定正确的 URI 和导入路径。这消除了手动为默认 QML 导入路径之外的依赖项指定IMPORT_PATH条目的必要性,减少了冗余,并避免了一类因复制粘贴导致的错误。
示例
假设有一个模块依赖于同一项目中定义的另一个模块。采用OLD 行为(或 Qt 6.8 之前),必须显式指定 URI:
qt_add_qml_module(my_module
URI MyModule
VERSION 1.0
DEPENDENCIES
OtherModule
)采用“NEW ”行为(策略 QTP0005 设置为NEW )时,您可以通过 CMake 目标名称引用该依赖项:
qt_policy(SET QTP0005 NEW)
qt_add_qml_module(other_module
URI OtherModule
VERSION 1.0
)
qt_add_qml_module(my_module
URI MyModule
VERSION 1.0
DEPENDENCIES
TARGET other_module
)相同的TARGET 语法也适用于IMPORTS 、OPTIONAL_IMPORTS 和DEFAULT_IMPORTS 。
当模块目标为可执行文件且使用了TARGET 依赖项时,qt_add_qml_module()会自动在构建目录中的可执行文件旁生成一个qt.conf 文件。该文件用于配置QML 导入路径,以便在运行时能够找到指定为TARGET 依赖项的 QML 模块。若要禁用此行为,请使用NO_GENERATE_QTCONF 。
如上所示,您可以在调用qt_add_qml_module() 之前,通过qt_policy(SET QTP0005 NEW) 显式设置该策略。或者,调用qt_standard_project_setup()并指定REQUIRES 版本为 6.8 或更高,即可启用该版本及之前的所有策略。
如果在策略设置为OLD 时,将TARGET 用作DEPENDENCIES 、IMPORTS 、OPTIONAL_IMPORTS 或DEFAULT_IMPORTS 中的参数,Qt 6.8会发出弃用警告。请使用qt_policy()命令将策略显式设置为OLD 或NEW ,以抑制该警告。
注意: 策略的OLD 行为 已弃用,未来可能会被移除。
另请参阅 qt_policy()、qt_standard_project_setup()、qt_cmake_policies 和qt_add_qml_module()。
© 2026 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.