以實際例子看qmldir的使用
- 1.搞一個qmldir
- 2.讓QML找到你的qmldir (重點)
- .pro 工程文件
- QQmlApplicationEngine加載主QML處
- 3.用起來你的模塊
qmldir是Qt QML模塊化的基石,其設計初衷是為解決QML文件的組織、復用和依賴管理問題,。只需要在每個文件夾內部搞一個qmldir,在任意qml里import之,就能隨意使用這個qmldir下的任何qml文件啦,模塊化管理還是很方便的
眾所周知把大象塞進冰箱只需要三步,所以qmldir的使用也只需要三步:
1.搞一個qmldir
我一般會在qrc文件處右鍵新建,你也可以自己安排
我這里項目目錄組織是:
根目錄
|
|--工程.pro文件
|--interface # 專門存放QML文件
| |--xxx.qrc
| |--BarCustom
| |--qmldir #每個組件目錄下一個qmldir!
| |--StatusBar.qm
| |--TitleBar.qml
| |--TopBarDefines.qml
......
注意qmldir的模塊名要和該文件夾名一樣,方便QML引擎找到qmldir文件
然后在qmldir填入你要聲明的內容、暴露出去使用的qml
# 模塊名
module BarCustom # 注意要和文件夾名一樣!#命名方式: 類名, 版本, 文件名
StatusBar 1.0 StatusBar.qml
TitleBar 1.0 TitleBar.qml
#QML的單例聲明,需要在.qml頭部寫pragma Singleton
singleton TopBarDefines 1.0 TopBarDefines.qml
相當于告訴QML引擎,我這里有一個模塊叫BarCustom 里面有StatusBar 1.0 版本,TitleBar 1.0版本…
2.讓QML找到你的qmldir (重點)
分別需要改兩個東西,一個是 .pro 文件,一個是 main主程序入口的QQmlApplicationEngine
處調用addImportPath
。
> QML引擎是根據``{QML_IMPORT_PATH}\文件夾名``去搜索你的qmldir的,比如說你要引用的``BarCustom``的qmldir 路徑是:
E:\SoureCode\myProject\interface\BarCustom\qmldir>那你就要讓QML知道qmldir搜索路徑在:
{QML_IMPORT_PATH}\interface>qrc:/ 也是如此:
qrc:/UI/ # UI/是我工程里創的,因 .qrc文件就在interface/下,所以指的就是interface/,按實際情況來,下面會講
.pro 工程文件
參考我上面給的目錄結構后,填這個即可,如果你的組件文件夾直接在項目根目錄,就$$PWD
即可
QML_IMPORT_PATH += $$PWD/interface/
QQmlApplicationEngine加載主QML處
這里我是在main.cpp里加載主QML,根據你的實際情況來就行:
QQmlApplicationEngine engine;
engine.addImportPath("qrc:/UI/");
值得注意的是這個qrc路徑怎么填,因為實際上它是按你實際目錄配置走,(如果你是接手別人的項目,那你需要注意這點)。
什么意思呢?
比如說我加載某一個qml界面用的是
settingPage.source = "qrc:/UI/Setting/MainSetting.qml"
雖然這時候我實際目錄結構里并沒有UI/ ,但這個UI/ 是項目管理時加的層級,所以在addimportPath
時也要加上該目錄
engine.addImportPath("qrc:/UI/");
當然,也可以直接看你的 .qrc 文件是怎么填的,最終目的都是根據文件夾名找到對應qmldir
這一步如果沒填對,會報找不到該模塊的,可以用以下方法打印看看模塊加載路徑:.pro文件 編譯窗口打印:
message("QML_IMPORT_PATH: $$QML_IMPORT_PATH").cpp 運行打印:
// 獲取并打印QML_IMPORT_PATH
QString importPath = qEnvironmentVariable("QML_IMPORT_PATH");
qDebug() << "QML_IMPORT_PATH:" << importPath;
似乎只有engine.addImportPath(“qrc:/UI/”);有效,pro文件里就算指定了所在的絕對目錄,都不行,還是說我配置有誤?歡迎評論區指正一起進步
3.用起來你的模塊
在要使用的qml里添加 import xxxxx(模塊名) 1.0(版本號)
即可。
如:
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import BarCustom 1.0 //xxxxx(模塊名) 1.0(版本號) 都是你qmldir聲明的內容
就可以愉快使用你模塊下聲明的任意一個qml啦
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import BarCustom 1.0 Rectangle {color: TopBarDefines.subColorStatusBar{//...}TitleBar{//......}
}/**********我qmldir的內容:***********/
//定義模塊名
module BarCustom # 注意要和文件夾名一樣!//命名方式: 類名, 版本, 文件名
StatusBar 1.0 StatusBar.qml
TitleBar 1.0 TitleBar.qml
//QML的單例聲明,需要在.qml頭部寫pragma Singleton
singleton TopBarDefines 1.0 TopBarDefines.qml
/***********************************/
當然,每次新添文件后,我都習慣重新構建一次,這樣能確保編譯到位