封装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和此模块,然后再使用
长风破浪会有时,直挂云帆济沧海!
可通过下方链接找到博主
https://www.cnblogs.com/judes/p/10875138.html