天天看點

QML-自定義子產品

作者:C加加Qt技術開發老傑

一、使用場景

使用情景就是不可再修改的QML或者js檔案,可定義成子產品,分為如下情況

1、自定義控件

這裡的自定義控件可以了解為最小機關控件,不可再修改,與QML的Button、Text等有同樣的地位;不要與能夠修改或者帶邏輯的控件混淆;

2、存放公共變量、函數的JS

如某個JS檔案裡存放工程所需的公共函數;

3、字型庫等

如FontAwesome。

本文以自定義公共控件為例 。

文章最後為大家準備了Qt資料

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

二、工程準備

1、建立工程,在根目錄下添加專門存放QML檔案的檔案夾:

Qml           

2、Qml檔案夾添加資源檔案用于管理所有QML檔案

qml.qrc           

3、資源檔案添加字首

qml           

可根據自己需要設定其他名字,也可不添加

4、在Qml檔案夾裡新增檔案夾

WPControls           

這個檔案夾以後就用于存儲我們所有的公共/自定義控件

5、在WPControls檔案夾裡添加一些自定義QML控件,注意大寫字母開頭。這裡增加了三個:

FaBtn.qml
WpTextInput.qml
ComboboxView.qml           

6、在WPControls檔案夾裡添加檔案:qmldir,并輸入子產品資訊、控件資訊

module WPControls
WPFaBtn 1.0 FaBtn.qml
WpTextInput 1.0 WpTextInput.qml
ComboboxView 1.0 ComboboxView.qml           

WPControls:子產品名,必須寫在開頭

WPFaBtn、WpTextInput、ComboboxView:控件名

1.0:版本号

Xxx.qml:對應qml檔案

7、通過qml.qrc資源檔案将所有自定義QML檔案添加到工程

QML-自定義子產品

8、設定QML運作時搜尋庫路徑

上面的步驟隻是将子產品定義好了,但是運作的時候QML是無法找到這個子產品的,是以需要告訴QML去哪裡尋找子產品。

可以寫一個單例類做這個事情:

QML-自定義子產品

方法就是:擷取運作main.qml的view的engine,通過addImportPath函數,将尋找路徑放進去。

為什麼這個路徑是:qrc:/qml呢?

【這個有個重點也是難點,這地方弄錯了會運作時報:xxx子產品沒有安裝】

因為在Qt裡一個子產品就是一個檔案夾,這裡我們的子產品就是WPControls檔案夾,我們需要告訴Qt我們的子產品檔案夾在哪裡,通過第七步的圖可看到,WPControls檔案夾的就在qrc:/qml裡。

這個"qml"就是我們資源檔案的字首,如果沒有字首【也就是字首為:/】,那麼這裡應該填:qrc:/

9、使用子產品

import QtQuick 2.6
import QtQuick.Window 2.2
import WPControls 1.0   //引入子產品
Rectangle {
    visible: true
    width: 640
    height: 480
    
    //自定義的控件
    WPFaBtn{

    }
}           

9、設定子產品語義高亮

其實前面步驟完成之後,程式是可以正常運作起來了的,但是我們可能看到import子產品時,QtCreator提示沒有找到這個子產品,這個問題單純就是在工程非運作時,Qt不知道這個子產品在哪裡,畢竟上面第八步的import函數是寫在cpp中,隻有運作才有效。

QML-自定義子產品

是以為了解決這個問題,我們打開.pro檔案,加入這句話:

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH += $PWD/Qml            #support:WPControls           

這句話代表,QtCreator高亮文法時,會從目前的Qml檔案夾下去查找子產品,如果找到了就不會報錯了。

注意這裡的路徑是檔案夾路徑,是以源碼路徑為基礎往下查找的地方【PWD就是目前源碼路徑】;

而第八步的import路徑是以資源檔案路徑,以qrc開頭。【即使有多個qrc檔案,Qt都認為是一個qrc,隻通過字首去區分?】

PS:

1、檢視cpp中目前import了的路徑:

QQmlApplicationEngine engine;
for(QString path : engine.importPathList())
    qDebug() << path;           

2、設定單例控件

qml檔案開頭:

//XXX.qml
pragma Singleton           

qmldir:

singleton XXX 1.0 XXX.qml           

3、QML找子產品的步驟

import XXX 1.0           

①、在addImportPath的路徑和預設路徑裡去找XXX檔案夾

②、沒找到則報子產品未安裝;

③、找到了則加載XXX檔案夾裡的qmldir檔案,解析裡面的執行個體化内容

這樣了解了,就容易填這個路徑了

4、如果運作沒有問題,并且很确定高亮路徑也沒有問題,但是代碼就是高亮失敗,可以嘗試重新開機下QtCreator

5、如果XXX是一個檔案夾,并且是一個子產品【裡面有個qmldir】,如果裡面有個a.qml,那麼這個a.qml是不能import XXX 1.0的,運作時會報找不到檔案

6、

qmldir: 用于組織自定義的QML插件

.qmltypes:qml插件的解釋檔案,用于QtCreator文法高亮。可通過Qt提供的工具qmlplugindump自動生成

QML_IMPORT_PATH: 導入插件路徑,以支援插件的文法高亮。個人了解是如果純QML檔案的擴充,沒有封裝到C++中,則直接導入路徑,即可支援文法高亮,如果有C++封裝,則需要通過.qmltypes支援高亮。

addImportPath: 添加import尋址目錄,c++代碼裡添加,沒有前兩項,隻是QtCreator不能高亮,沒有這種,則插件無法使用

Qt開發學習路線

Qt學習資料→「連結」