【转】QML插件扩展

一、基于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

附录

  1. 如果想自己写C++扩展,可以将QtQuick.Controls 源代码研究研究

  2. 该节示例代码:https://github.com/youngerking1985/QML_Learn/tree/master/QMLPlugin2

注意:

  1. qmlplugindump会区分release和debug,建议直接编译release

  2. 如果插件应用了除Qt之外的dll(建议不要这么引用),需要将dll跟qmlplugindump放同一个目录

  3. 如果使用了c++编写的dll插件方式, module的名称不能与exe内部注册的mudule重复

网址:http://www.cnblogs.com/yanhuiw/p/4722557.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值