二、Qt6CMake——qt_add_qml_module
1 前言
-
qt_add_qml_module
用于创建和管理QML模块。可以创建QML模块组件。 -
qt_add_qml_module
和qt6_add_qml_module
可以认为是相同的,只是qt6表示了版本,qt_没有版本指定,其实本质调用也是qt6_add_qml_module
。
在调用qt_add_qml_module时,它会执行以下操作:
-
创建一个动态链接库。作为QML模块的插件——该库将包含定义自定义QML元素的C++类和其他资源。
或者创建一个静态链接库。
-
自动创建一个qrc文件,该文件将包含指定源文件中的所有资源,例如图片、样式表和翻译文件。
-
生成一个描述该QML模块的
qmldir
文件,其中包含URI、版本号、导出对象名等信息。 -
将QML插件动态链接库和描述文件复制到项目二进制目录的特定子目录中。该位置取决于是单个项目还是多个项目,以及是在构建目录还是安装目录中构建应用程序/库。
2 参数
qt_add_qml_module 函数提供了多个参数,以便您在创建 QML 模块时进行配置。以下是按功能分类的参数列表:
-
模块基本信息:
-
TARGET:目标名称,用于指定模块关联的可执行文件或库。
-
URI:模块的 URI,用于在 QML 代码中 import。
-
VERSION:模块的版本号。
-
-
QML 文件和资源:
-
QML_FILES:QML 文件列表,包括所有要编译到模块中的 QML 文件。
-
SOURCES:源文件列表,包括所有要编译到模块中的源代码文件和资源文件。可以包含 QML 文件。
-
-
其他资源文件:
-
RESOURCE_FILES:要包含在模块中的其他资源文件,例如图片、音频等。
-
STATIC_RESOURCE_FILES:静态资源文件,类似于 RESOURCE_FILES,但会嵌入到二进制文件中。
-
RESOURCE_PREFIX:资源文件的前缀路径。
-
-
输出设置:
-
OUTPUT_DIRECTORY:模块输出的目录。
-
DEBUG_OUTPUT_DIRECTORY:模块在调试模式下的输出目录。
-
RELEASE_OUTPUT_DIRECTORY:模块在发布模式下的输出目录。
-
-
其他选项:
-
INSTALL_QMLDIR:用于指定安装模块时的 QML 目录。
-
NO_PLUGIN_OPTION:禁用生成插件文件的选项。
-
这些参数可以根据您的需求进行选择和配置,以便为您的项目创建适当的 QML 模块。
3 重要参数说明
-
TARGET
和PLUGIN_TARGET
最好名称一样,如果不指定PLUGIN_TARGET
,会默认生成TARGET+plugin
的库文件。这样会有两个动态库文件,使用qds的时候会报错,不能正常链接动态库。 -
URI
和VERSION
4 问题总结
4.1 动态库
TARGET
和 PLUGIN_TARGET
名称不一样,就会有两个库。这样如果使用Module组件,就会报错无法加载库 C 。这是因为只调用了 exampleplugin.dll
,调用不到 example.dll
。所以一般要显式定义 PLUGIN_TARGET
。
4.2 静态库
-
qt_add_library(example STATIC)
指定为静态库。 -
使用该插件的C++源文件需要添加:
Q_IMPORT_QML_PLUGIN(examplePlugin)
。
Q_IMPORT_QML_PLUGIN:
Q_IMPORT_QML_PLUGIN
是 Qt 提供的一个宏,其主要作用是 在静态编译(静态链接)Qt 插件时,确保插件被正确地注册并可以在 QML 中使用。
在 Qt 中,QML 插件通常以动态库的形式存在(.so、.dll 等),可以在运行时自动发现和加载。
但当你使用 静态编译(也就是将 Qt 库和插件编译进可执行文件中)时,Qt 无法自动发现这些 QML 插件,因此需要手动告诉 Qt “我要导入这个插件”。
Q_IMPORT_QML_PLUGIN
后面的名称就是 qmldir
文件中的 classname
名称。
这个类名定义规范:当你在 CMake 中使用 qt_add_qml_module() 添加一个 QML 模块时,Qt 会自动为你生成一个插件扩展类。默认情况下,这个类的名字来源于 URI 参数,将其中的 . 替换为 _ 并且最后加Plugin。