为QML创建C ++插件
创建一个插件
该QML发动机负荷C ++插件QML。此类插件通常在QML扩展模块中提供,并且可以在导入模块的QML文档中提供供客户端使用的类型。一个模块至少需要注册一种类型才能被视为有效。
QQmlEngineExtensionPlugin是一个插件接口,可以创建可以动态加载到QML应用程序中的QML扩展。这些扩展允许自定义QML类型可用于QML引擎。
编写QML扩展插件:
- 子类QQmlEngineExtensionPlugin并使用Q_PLUGIN_METADATA()宏将插件注册到Qt元对象系统。
- 使用QML_ELEMENT和QML_NAMED_ELEMENT()宏来声明QML类型。
- 为插件编写一个项目文件。加:
CONFIG += qmltypes
指示构建系统生成QML类型。QML_IMPORT_NAME = <my.import.name>
指定导入名称。QML_IMPORT_MAJOR_VERSION = <version>
指定导入主版本。
- 创建一个qmldir文件来描述插件
QML扩展插件适用于特定于应用程序或类似库的插件。库插件应将自身限制为注册类型,因为对引擎根上下文的任何操纵都可能导致库用户代码中发生冲突或其他问题。
TimeExample QML扩展插件
假设有一个新的TimeModel
C ++类应作为新的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插件的信息