【轉】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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章