一、基於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重複