在Qt Quick中使用插件/库文件

在Qt Quick中使用插件/库文件

本文里,插件plugin库文件library 所指代的是相同的意思,都是指对QML的扩展,表示类库插件(library-like plugins,类似库的插件)。本文中可能会混用这两个名词。
本文所涉及环境有

  • Qt version - 5.15.2
  • Qt Creator version - 7
  • 操作系统 - Deepin 20.7 (Linux)
    以下进入正题。

插件的由来

为什么会有插件?插件是用来扩展QML能力的,这属于QML与C++ 集成的大议题,建议先阅读QML与C++ 集成概览 。插件只是QML与C++ 集成议题中的一种场景。它可以为QML提供可实例化的自定义QML类。
可以参考为QML创建C++ 插件 这篇文章。仔细阅读文中的示例代码,可以得出如何实现插件。如果想自己实现一个含有可视元素的自定义类型的插件,这篇官方的文章及源码真的非常值得研究(在Qt Creator的欢迎里打开示例,搜索qmlextensionplugins)。由此可知,一个可包含自定义的可视QML类型的插件,应该包含以下文件内容:

  • libxxx.so - 这是插件的主文件,是插件的主要逻辑实现
  • qmldir - 是对插件及内含的自定义模块(QML类型)、版本的描述文件
  • xxx.qmltypes - 是对自定义模块(QML类型)的继承、依赖、属性、信号等类型细节的描述文件。如果没有此文件,在其它应用引用此插件中的模块时,Qt Creator无法给出敏感提示。
  • xxx.qml - 如果插件中含有自定义的可视的QML类型,则会有.qml文件来描述自定义的图形展示。可能还包含此组成此图形所需要的其它素材,如xxx.png等。
    插件的编写,在项目模板、CONFIG、插件导入名称、生成路径、生成的插件名称、qmltypes文件名及路径、插件的其它素材文件等配置上,有很多注意事项,都集中在示例中的.pro文件里,自已要写插件工程的配置,照葫芦画瓢即可。

插件的使用

确切地说,是作为三方插件来说,如何在其它Qt项目中使用。官方示例(qmlextensionplugins)在这个方面没太有参考性,因为它只用了一个qml来引用自定义Clock元素,仅作了原型(UI Prototype)展示,让你知道自定义的QML类型实例化后的样子而已。
因此,探索如何在其它Qt项目中使用三方插件的通用方法,就成了本文的重点。以下是操作步骤
第一步:打开Qt Creator新建一个Qt Quick Application类型的项目,名字就取为myclock。创建项目时的各步操作取默认值。
第二步:将官方示例中生成的插件imports/TimeExample 整个文件夹都拷贝到myclock的项目的根目录下,则myclock的目录结构如下:
myclock的目录结构
第三步:在myclock.pro工程文件里,配置好自定义插件/模块导入路径。整个myclock.pro代码如下:

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

其中 QML_IMPORT_PATH = imports 是必须的。如果没有它,在Qt Creator里编辑代码时,自定义的Clock就不会被认定为合法元素,其属性、方法等也就不会有敏感提示。
如果你不使用Qt Quick Disigner来设计和编辑QML,那么QML_DESIGNER_IMPORT_PATH 变量不是必须的。
第四步:在项目启动代码中,添加上导入路径,代码如下:

...
engine.addImportPath(QStringLiteral("imports"));
...

编译,完成!经过以上四步后,Qt Quick Application项目已经可以正常使用第三方插件TimeExample了。
对了,项目的正常运行,需要将插件拷贝到编译输出目录下(我的是build-myclock-Desktop_Qt_5_15_2_GCC_64bit-Debug,你的会有差异),即app的同级目录。这可以通过在.pro中配置实现。本文图省事,直接手工将其拷过去了。

posted @ 2022-09-14 12:06  sammy621  阅读(595)  评论(0编辑  收藏  举报