Linuxkiss
    首页 Linux C/C++ C++面试 Qt答疑 Qml中文手册 Qt CMake Python 工具
Linuxkiss
www.linuxkiss.com 你可以精通一门IT技术
  1. 首页
  2. Qml中文手册
  3. 正文

为QML创建C ++插件(Creating C++ Plugins for QML)

2020年08月25日 19点热度 0人点赞

为QML创建C ++插件

创建一个插件

该QML发动机负荷C ++插件QML。此类插件通常在QML扩展模块中提供,并且可以在导入模块的QML文档中提供供客户端使用的类型。一个模块至少需要注册一种类型才能被视为有效。

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

编写QML扩展插件:

  1. 子类QQmlEngineExtensionPlugin并使用Q_PLUGIN_METADATA()宏将插件注册到Qt元对象系统。
  2. 使用QML_ELEMENT和QML_NAMED_ELEMENT()宏来声明QML类型。
  3. 为插件编写一个项目文件。加:
    • CONFIG += qmltypes 指示构建系统生成QML类型。
    • QML_IMPORT_NAME = <my.import.name> 指定导入名称。
    • QML_IMPORT_MAJOR_VERSION = <version> 指定导入主版本。
  4. 创建一个qmldir文件来描述插件

QML扩展插件适用于特定于应用程序或类似库的插件。库插件应将自身限制为注册类型,因为对引擎根上下文的任何操纵都可能导致库用户代码中发生冲突或其他问题。

TimeExample QML扩展插件

假设有一个新的TimeModelC ++类应作为新的QML类型提供。它提供当前时间hour和minute属性。它声明Time通过QML_NAMED_ELEMENT()调用的QML类型。

class TimeModel : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int hour READ hour NOTIFY timeChanged)
    Q_PROPERTY(int minute READ minute NOTIFY timeChanged)
    QML_NAMED_ELEMENT(Time)
    ...

为了使这种类型可用,我们创建一个名为的插件类QExampleQmlPlugin,它是QQmlEngineExtensionPlugin的子类。它使用类定义中的Q_PLUGIN_METADATA()宏,使用插件的唯一标识符在Qt元对象系统中注册插件。

class QExampleQmlPlugin : public QQmlEngineExtensionPlugin
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid)
};

插件的项目设置

此外,项目文件(.pro)将项目定义为插件库,指定应将其构建在imports/TimeExample目录中,并注册插件目标名称和其他各种详细信息:

TEMPLATE = lib
CONFIG += qt plugin qmltypes
QT += qml

QML_IMPORT_NAME = TimeExample
QML_IMPORT_MAJOR_VERSION = 1

DESTDIR = imports/$$QML_IMPORT_NAME
TARGET  = qmlqtimeexampleplugin

SOURCES += qexampleqmlplugin.cpp

这会将TimeModel类注册为import TimeExample 1.0,称为QML类型Time。在从C ++定义QML类型的文章有关于注册的C ++类型在QML使用的详细信息。

qmldir中的插件定义

最后,目录中需要一个qmldir文件imports/TimeExample来描述插件及其导出的类型。该插件包含一个Clock.qml文件以及qmlqtimeexampleplugin由项目构建的.pro文件(如文件中上面所示),因此这两个文件都需要在qmldir文件中指定:

module TimeExample
Clock 1.0 Clock.qml
plugin qmlqtimeexampleplugin

为了使本示例更容易理解,TimeExample源目录位于中imports/TimeExample,我们构建in-source。但是,源目录的结构并不重要,因为该qmldir文件可以指定已安装QML文件的路径。

重要的是安装qmldir的目录的名称。当用户导入我们的模块时,QML引擎使用模块标识符(TimeExample)查找插件,因此安装该插件的目录必须与模块标识符匹配。

一旦该项目建成,并安装新Time组件是任何QML组件访问的是进口TimeExample模块

import TimeExample 1.0 // import types from the plugin

Clock { // this class is defined in QML (imports/TimeExample/Clock.qml)

    Time { // this class is defined in C++ (plugin.cpp)
        id: time
    }

    hours: time.hour
    minutes: time.minute
}

完整的源代码可在插件示例中找到。

参考

  • 使用C ++编写QML扩展 -包含有关创建QML插件的章节。
  • 从C ++定义QML类型 -有关将C ++类型注册到运行时的信息。
  • 如何创建Qt插件 -有关Qt插件的信息

 

英文官方地址:https://doc.qt.io/qt-5/qtqml-modules-cppplugins.html

标签: qml中文手册 qml中文文档
最后更新:2020年08月25日

Leo

保持饥渴的专注,追求最佳的品质

点赞
< 上一篇
下一篇 >
关注公众号

日历
2021年4月
一 二 三 四 五 六 日
« 2月    
 1234
567891011
12131415161718
19202122232425
2627282930  
最新 热点 随机
最新 热点 随机
windows中出现"无法解析的外部符号"到底是什么原因 Qt5中lambda表达式用法,非常实用 warning: class 'InterFace' defines a non-default destructor but does not define a copy constructor, a copy assignment operator, a move constructor or a move assignment operator 无法解析的外部符号 "public: static struct QMetaObject const Windows下Qt代码出现的错误总结 QT Creator如何在创建项目的时候,头文件和cpp文件的首字母默认大写
QML代码隐藏的实现资源(Code-Behind Implementation Resource) opencv系列10--膨胀与腐蚀 [ api:getStructuringElement,api:dilate,api:erode ] QML文件的结构【详细说明】(Structure of a QML Document) QML中动态删除对象(Deleting Objects Dynamically) C++中const有什么作用 QT中如何获取本机mac地址和ipv4地址
标签聚合
C++ qml中文文档 openCv qmake C/C++面试 Linux qml中文手册 Qt

COPYRIGHT © 2020 Linuxkiss. ALL RIGHTS RESERVED.