为 QML 创建 C++ 插件
创建插件
QML engine 会加载用于QML的C++插件。此类插件通常包含在QML扩展模块中,可为导入该模块的QML文档中的客户端提供类型。一个模块至少需要包含一个已注册的类型,才被视为有效。
QQmlEngineExtensionPlugin 是一个插件接口,可让您创建能够动态加载到 QML 应用程序中的 QML 扩展。这些扩展使自定义 QML 类型能够供 QML 引擎使用。
要编写 QML 扩展插件:
- 继承 `QQmlEngineExtensionPlugin ` 类,并使用 `Q_PLUGIN_METADATA()` 宏将插件注册到 Qt 元对象系统中。
- 使用QML_ELEMENT 和QML_NAMED_ELEMENT() 宏来声明 QML 类型。
- 配置您的构建文件。
CMake:
qt_add_qml_module(<target> URI <my.import.name> VERSION 1.0 QML_FILES <app.qml> NO_RESOURCE_TARGET_PATH )qmake:
CONFIG += qmltypes QML_IMPORT_NAME = <my.import.name> QML_IMPORT_MAJOR_VERSION = <version> - 如果您使用的是 qmake,请创建一个qmldir 文件来描述该插件。请注意,CMake 默认会自动生成qmldir 文件。
QML 扩展插件可用于应用程序专用或类库式的插件。类库插件应仅限于注册类型,因为对引擎根上下文的任何操作都可能在类库用户的代码中引发冲突或其他问题。
注意: 使用 CMake 的qt_add_qml_moduleAPI时,系统 会自动为您生成一个插件,该插件将负责类型注册。 只有当你有特殊需求时(例如注册自定义图像提供程序),才需要编写自定义插件。在这种情况下,请在调用 `qt_add_qml_module ` 时传入`NO_GENERATE_PLUGIN_SOURCE` 参数,以禁用默认插件的生成。
链接器可能会在优化过程中错误地移除生成的类型注册函数。您可以在代码中的某处声明一个指向该函数的合成易失性指针,以此防止这种情况发生。该函数由qmltyperegistrar 生成,其名称由qml_register_types_ 与模块 URI 拼接而成,其中所有句点均被下划线替换。
如果您的模块名为“my.module”,则需在全局作用域中添加前向声明:
void qml_register_types_my_module();然后在与该注册函数属于同一二进制文件的任何函数的实现中,添加以下代码片段:
volatile auto registration = &qml_register_types_my_module;
Q_UNUSED(registration);参考
- 使用 C++ 编写 QML 扩展- 其中包含一章关于创建 QML 插件的内容。
- 从 C++ 定义 QML 类型— 有关将 C++ 类型注册到 QML Runtime 环境的信息。
- 如何创建 Qt 插件- 有关 Qt 插件的信息
© 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.