QT += quick
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp
RESOURCES += qml.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH = imports
# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH = imports
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
本文里,
插件plugin
或库文件library
所指代的是相同的意思,都是指对QML的扩展,表示类库插件
(library-like plugins,类似库的插件)。本文中可能会混用这两个名词。本文所涉及环境有
以下进入正题。
插件的由来
为什么会有插件?插件是用来扩展QML能力的,这属于QML与C++ 集成的大议题,建议先阅读QML与C++ 集成概览 。插件只是QML与C++ 集成议题中的一种场景。它可以为QML提供可实例化的自定义QML类。
可以参考为QML创建C++ 插件 这篇文章。仔细阅读文中的示例代码,可以得出如何实现插件。如果想自己实现一个含有可视元素的自定义类型的插件,这篇官方的文章及源码真的非常值得研究(在Qt Creator的欢迎里打开示例,搜索qmlextensionplugins)。由此可知,一个可包含自定义的可视QML类型的插件,应该包含以下文件内容:
插件的编写,在项目模板、CONFIG、插件导入名称、生成路径、生成的插件名称、qmltypes文件名及路径、插件的其它素材文件等配置上,有很多注意事项,都集中在示例中的.pro文件里,自已要写插件工程的配置,照葫芦画瓢即可。
插件的使用
确切地说,是作为三方插件来说,如何在其它Qt项目中使用。官方示例(qmlextensionplugins)在这个方面没太有参考性,因为它只用了一个qml来引用自定义Clock元素,仅作了原型(UI Prototype)展示,让你知道自定义的QML类型实例化后的样子而已。
因此,探索如何在其它Qt项目中使用三方插件的通用方法,就成了本文的重点。以下是操作步骤
第一步:打开Qt Creator新建一个Qt Quick Application类型的项目,名字就取为myclock。创建项目时的各步操作取默认值。
第二步:将官方示例中生成的插件
imports/TimeExample
整个文件夹都拷贝到myclock的项目的根目录下,则myclock的目录结构如下:第三步:在myclock.pro工程文件里,配置好自定义插件/模块导入路径。整个myclock.pro代码如下:
其中
QML_IMPORT_PATH = imports
是必须的。如果没有它,在Qt Creator里编辑代码时,自定义的Clock就不会被认定为合法元素,其属性、方法等也就不会有敏感提示。如果你不使用Qt Quick Disigner来设计和编辑QML,那么
QML_DESIGNER_IMPORT_PATH
变量不是必须的。第四步:在项目启动代码中,添加上导入路径,代码如下:
编译,完成!经过以上四步后,Qt Quick Application项目已经可以正常使用第三方插件TimeExample了。
对了,项目的正常运行,需要将插件拷贝到编译输出目录下(我的是build-myclock-Desktop_Qt_5_15_2_GCC_64bit-Debug,你的会有差异),即app的同级目录。这可以通过在.pro中配置实现。本文图省事,直接手工将其拷过去了。
如果你对Qt Quick有兴趣,这里有个合集