为 QML 创建 C++ 插件

创建一个插件

QML 引擎加载 QML 的 C++ 插件。此类插件通常以 QML 扩展模块的形式提供,可以为导入了该模块的 QML 文档中的客户端提供类型。一个模块必须至少有一个已注册的类型才能被认为是有效的。

QQmlEngineExtensionPlugin 是一个插件接口,允许您创建可以在 QML 应用程序中动态加载的 QML 扩展。这些扩展使得自定义 QML 类型可供 QML 引擎使用。

要编写一个 QML 扩展插件

  1. 继承 QQmlEngineExtensionPlugin 并使用 Q_PLUGIN_METADATA() 宏将插件注册到 Qt 元对象系统中。
  2. 使用 QML_ELEMENTQML_NAMED_ELEMENT() 宏来声明 QML 类型。
  3. 配置你的构建文件。

    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>
  4. 如果你使用 qmake,创建一个 qmldir 文件 来描述插件。请注意,CMake 将默认自动生成 qmldir 文件

QML 扩展插件是用于特定应用程序或类似库的插件。库插件应限制自己注册类型,因为对引擎根上下文进行的任何操作都可能在线程用户代码中引起冲突或其他问题。

注意:当使用 CMake 的 qt_add_qml_module API 时,将自动为您生成一个插件。它会处理类型注册。如果您需要特殊要求(例如注册自定义图像提供程序),则只需编写自定义插件。在这种情况下,将 NO_GENERATE_PLUGIN_SOURCE 传递给 qt_add_qml_module 调用来禁用默认插件的生成。

链接器可能会错误地将生成的类型注册函数作为优化移除。您可以通过在代码中某处声明对函数的伪活动指针来防止这种情况。如果您的模块名为 "my.module",您将在全局作用域添加前向声明

void qml_register_types_my_module();

然后,在实现注册函数所在同一二进制文件的任何函数中添加以下代码段

volatile auto registration = &qml_register_types_my_module;
Q_UNUSED(registration);

参考

© 2024Qt公司有限公司。本文件中包含的文档贡献是其各自所有者的版权。