一、基于QML文件的扩展方式
基本概念
qmldir:
用于组织自定义的QML插件,qmldir的具体写法可参考
.qmltypes: qml插件的解释文件,用于QtCreator语法高亮。可通过Qt提供的工具qmlplugindump自动生成
QML_IMPORT_PATH: 导入插件路径,以支持插件的语法高亮。个人理解是如果纯QML文件的扩展,没有封装到C++中,则直接导入路径,即可支持语法高亮,如果有C++封装,则需要通过.qmltypes支持高亮。
addImportPath: 添加import寻址目录,c++代码里添加,没有前两项,只是QtCreator不能高亮,没有这种,则插件无法使用。
具体步骤
1. 建立插件工程
- 首先通过QtCreator创建一个QMLPluginTest子目录工程;
- 在QMLPluginTest子目录下,添加app测试工程;
- 新建QML插件工程,MyPlugin;
- 新建向导会自动创建示例文件及插件名称,这里可自己修改URI名称,即你的插件名称;
- 自动创建的MyPlugin生成目录结构如图:
其中qmldir
的文件描述插件如下
module MyPlugin
plugin QMLPlugin
- 在MyPlugin目录下,添加扩展qml,这里添加一个测试矩形,MyRect.qml;
- 在qmldir中添加MyRect.qml;
2. 使用插件
- 在app工程的main.qml中,import MyPlugin 1.0
- 主要到右边代码中有让人郁闷的波浪线,说明QtCreator没有识别你的插件,需要QML_IMPORT_PATH来标记,打开app.pro文件,默认创建时QML_IMPORT_PATH =,没有赋值,修改为插件的路径,建议这里使用相对路径:
QML_IMPORT_PATH = $$PWD/../
- 关闭QtCreator,重新打开,可以红色波浪线么有了;
- 在main.qml中,使用创建的MyRect;
- 最后一步,导入插件路径,在app的main.cpp添加import代码,如果没有这句,程序启动会报错误:
qrc:/main.qml:3 module "MyPlugin" is not installed
所以需在c++中添加importPath,代码如下:
QQmlApplicationEngine engine;
engine.addImportPath("E:/T/QMLPlugin/QMLPluginTest/");//注意这里导入路径是MyPlugin的上层文件夹,不是MyPlugin文件夹
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
- 最后的程序目录结构:
二、基于C++的插件扩展方式
1. 更新插件工程
- 更新MyPlugin工程下的qmldir文件,加入plugin MyPlugin, 其中MyPlugin是插件的动态库名称,在windows下对应MyPlugin.dll;
- 编译MyPlugin插件,生成MyPlugin.dll,这里工程没有copy配置,所以默认dll不会拷贝到E:/T/QMLPlugin/QMLPluginTest/,需手动拷贝;
- 这个时候,就可以再app里的main.qml下使用;
2. 生成插件描述文件qmltypes
- 在本例中,因为插件跟app放在同一个大目录工程下,所以MyItem会自动高亮,如果不在同一个目录工程,将没有高亮及提示,这是就需要qmltypes描述文件来支持高亮了;
- 调用qmlplugindump生成描述文件:
qmlplugindump MyPlugin 1.0 E:\T\QMLPlugin\QMLPluginTest > E:\T\QMLPlugin\QMLPluginTest\MyPlugin\plugin.qmltypes
会自动生成描述文件:
import QtQuick.tooling 1.1
// This file describes the plugin-supplied types contained in the library.
// It is used for QML tooling purposes only.
//
// This file was auto-generated by:
// 'qmlplugindump MyPlugin 1.0 E:\T\QMLPlugin\QMLPluginTest'
Module {
Component {
name: "MyItem"
defaultProperty: "data"
prototype: "QQuickItem"
exports: ["MyItem 1.0"]
exportMetaObjectRevisions: [0]
}
}
- 再次打开MyPlugin工程的,加上这句:typeinfo plugin.qmltypes
附录
-
如果想自己写C++扩展,可以将QtQuick.Controls 源代码研究研究
-
该节示例代码:https://github.com/youngerking1985/QML_Learn/tree/master/QMLPlugin2
注意:
-
qmlplugindump会区分release和debug,建议直接编译release
-
如果插件应用了除Qt之外的dll(建议不要这么引用),需要将dll跟qmlplugindump放同一个目录
-
如果使用了c++编写的dll插件方式, module的名称不能与exe内部注册的mudule重复