封装QML扩展插件

环境MSVC2019-x64+Qt5.15.2

一、纯QML实现插件

即插件内部实现全部是QML的,与C++无关

1、 新建插件工程

2、工程名为SPMaker

 

默认生成的dll插件名=Target=工程名

3、设置详情

 

其中MyItem是默认添加的C++类,测试期间可以不修改名字,由于这里只测试QML实现的插件,即使删掉也无所谓;

URI是使用时引入的包名,建议和工程名一致

4、这里主要测试QML插件,工程生成后将MyItem类删除

 

5、将spmarker_plugin.cpp中与MyItem相关的删除

 

6、在根目录下新建QML文件夹,方便存放QML文件

7、在文件夹里新建资源文件

8、在资源文件里新建需要导出的QML文件

9、新建待导出QML文件所依赖的QML文件

 

其中MyRect.qml是希望别人能够直接使用的qml

 

其中BaseRect.qml是一个基础qml,由MyRect.qml里调用

 

需要注意的是:BaseRect.qml最终会被编译进dll,故打包时不需要复制,MyRect.qml需要

10、在spmarker_plugin.cpp中注册QML组件

qmlRegisterType(QUrl("qrc:/qml/MyRect.qml"), uri, 1, 0, "MyRect");

 

11、分别在Debug和Release下构建工程,收集生成的dll、qmldir、MyRect.qml

12、新建文件夹SPMaker,即与包名一致

13、将11步中生成的文件放进文件夹

此文件夹如果放在D:\Qt5.15.2\5.15.2\msvc2019_64\qml下,则当前环境所有Quick工程都可以直接使用,因为Qt会自动把这个路径作为import查找路径。

我这里是存放到Third_Party文件夹,此文件夹由git同步,方便其他PC可以同步使用。

 

14、此时使用这个插件会没有提示,通过qmlplugindump来生成提示文件

打开对应Qt版本的终端,进入SPMaker文件夹的上层目录,输入指令:

qmlplugindump -nonrelocatable SPMarker 1.0 ./ > SPMarker/plugin.qmltypes

此时在SPMaker文件夹里已经生成了plugin.qmltypes文件

15、修改qmldir,增加一句话:

typeinfo plugin.qmltypes

 

经测试,这里不加这句话也可以。。。

 

大功告成,需要注意:

1、一定要Debug和Release下的dll都编译,不然Debug工程使用Release的dll会报错插件未安装

2、为了方便将需要的文件自动生成到指定路径,在pro里这样配置:

TEMPLATE = lib
TARGET = SPMarker
QT += qml quick
CONFIG += plugin c++11

###########生成路径,debug和release可放在同一文件夹里##########
contains(DEFINES, WIN64) {
    message("WIN64")
    DESTDIR = $$(Third_Party)/WpQuickControls/msvc2019_64/SPControls/$$TARGET
} else {
    message("WIN32")
    DESTDIR = $$(Third_Party)/WpQuickControls/msvc2019/SPControls/$$TARGET
}

TARGET = $$qtLibraryTarget($$TARGET)   #如果是debug就加上d
uri = SPMarker


#####生成qmltypes文件#####
#CONFIG += qmltypes
#QML_IMPORT_NAME = SPMarker
#QML_IMPORT_MAJOR_VERSION = 1
#QMLTYPES_FILENAME = $$DESTDIR/plugins.qmltypes


#####源码路径#####
SOURCES += \
        spmarker_plugin.cpp

HEADERS += \
        spmarker_plugin.h


#####资源文件#####
RESOURCES += \
    QML/qml.qrc


#####定义需要拷贝的文件#####
DISTFILES = \
    QML/MyRect.qml \
    qmldir

#####待拷贝文件路径#######
file.files += $$DISTFILES    #files代表需要拷贝的文件

#####文件拷贝目标路径######
file.path = $$DESTDIR/       #path代表文件需要拷贝到的目的路径

#target.path += $$PWD/       #dll在当前文件夹也会生成
#INSTALLS +=  target file    #dll在当前文件夹也会生成

INSTALLS += file             #注意必须给build的make参数里加上install,不然不会执行install

3、为了方便自动生成qmltypes文件,新建bat脚本,并执行

D:/Qt5.15.2/5.15.2/msvc2019_64/bin/qmlplugindump -nonrelocatable SPMarker 1.0 ../ > plugin.qmltypes

按需修改,参数对应为:qmlplugindump路径+nonrelocatable参数+模块名+模块父路径+版本+输出符号+qmltypes文件名

4、使用,与使用基本控件一致

import SPMarker 1.0
Item {
    SPMarker {}
}

 

 

二、纯C++实现的插件

即插件内部实现全部是C++的,与QML无关 ;如果上面的步骤都懂了,这里就非常简单~

1、步骤与纯QML实现一致,新建工程,这里C++类名、URI都为:SeriesUpdateTool,没有使用任何资源和QML文件

 

 2、SeriesUpdateTool类是QObject子类,与注册C++类为QML使用时一样

 

 3、在seriesupdatetool_plugin.cpp中注册C++类

 

 4、qmldir中加上:

typeinfo plugin.qmltypes

注意:此步

5、收集Debug和Release下的dll,qmldir文件到同一个文件夹里,也可以与QML插件时一致,在pro里设置需要复制的文件

 

 6、生成qmltypes文件

 

 执行脚本,生成文件成功

 

 使用方式一致,QML实现插件时,还需要复制需要导出的QML文件,而这里不需要

 

三、具备依赖关系的插件

对于我的实验环境,上文的C++实现插件实际上只是一个工具,不直接面向使用者,需要再次实现一个能够面向使用者的插件,在此插件里使用到了上文的C++实现插件。需要注意好几个点,否则很容易失败~

1、新建插件工程,我这里是QML实现插件,插件名、URI为:SPTrace

2、新建资源文件,新建需要导出的QML

 

 3、在QML中调用了上文的C++实现插件

 

 此步需要注意,需要将C++实现插件文件夹复制当前源码工程下,否则会报模块找不到错误

 

 4、构建工程,在希望的环境里生成模块

 

 5、生成qmltypes文件

 

 执行脚本,或者在CMD里执行此命令

需要注意:当前路径下一定要有C++实现插件模块,否则会报错找不到模块

 

 

 

PS:

1、如果某模块里使用了某JS模块,需要在当前模块路径下将JS模块放过去做依赖

2、如果某模块使用了FA字体模块,然而FA字体模块是无法创建成模块的,所以需要将FA相关的信息定义成属性,在此模块里不要有FA相关的体现;在使用此模块的时候需要import FA和此模块,然后再使用

 

posted @ 2022-04-27 22:23  朱小勇  阅读(932)  评论(0编辑  收藏  举报