一、QML界面控件加載順序
QML在界面加載時的順序和我們認知的有很大的不同,有時候會對我們獲取參數以及界面實現造成很大的困擾
1、加載順序
import QtQuick 2.12
import QtQml 2.12
import QtQuick.Window 2.12
import QtQuick.VirtualKeyboard 2.4Window {id: windowwidth: 800height: 480visible: truetitle: qsTr("Hello World")Component.onCompleted:{console.log("Window success") // 2}Item {Component.onCompleted:{console.log("Item success") // 7}}Rectangle{anchors.fill: parentcolor: "red"Row{Repeater{model: 3Text {width: 100height: 50font.pixelSize: 30color: "blue"horizontalAlignment: Text.AlignHCenterverticalAlignment: Text.AlignVCentertext: qsTr("text")Component.onCompleted:{console.log("text success") // 1}}Component.onCompleted:{console.log("Repeater success") // 6}}Component.onCompleted:{console.log("Row success") // 5}}Component.onCompleted:{console.log("Rectangle success") // 4}}InputPanel {id: inputPanelz: 99x: 0y: window.heightwidth: window.widthstates: State {name: "visible"when: inputPanel.activePropertyChanges {target: inputPanely: window.height - inputPanel.height}}transitions: Transition {from: ""to: "visible"reversible: trueParallelAnimation {NumberAnimation {properties: "y"duration: 250easing.type: Easing.InOutQuad}}}Component.onCompleted:{console.log("InputPanel success") // 3}}
}
運行上面代碼后調試信息如下:
總結:
除C++模塊外,先是加載界面內的Repeater中重復的內容!!!!
再加載界面本身
然后按照從下到上,由外到內的加載,但是界面展示的順序是由上到下!!!!
(信號的改變以及loader需要加載的都是優先加載的)
信號的改變高于界面本身的加載
2、影響
由于Repeater中重復的控件是最先被加載的,所以如果在加載的時候給控件賦初值,而這個值又是從C++端獲取的參數,這時能否賦值成功取決于從C++獲取參數的方式,如下第一種方式可以,第二種就會有問題
(1)導入c++的Object模塊,實例化類對象,參數(類成員變量)在類的定義中使用 Q_PROPERTY 聲明過。qml在任何時候調用被Q_PROPERTY宏修飾過參數都是不影響的
例1:
類定義:
Q_PROPERTY(int sampMode READ getSampMode WRITE setSampMode NOTIFY paraChanged)
Q_PROPERTY(int offerMode READ getOfferMode WRITE setOfferMode NOTIFY paraChanged)
例2:
(2)通過函數等方法傳遞 的參數就要注意了,函數調用的時機就尤為重要,必須在控件加載前調用!!!如下:
- C++返回一個QVariantList類型的值給到qml端
- Qml導入模塊調用函數獲取返回值
- 根據加載順序,這個時候在加載repeater的時候如果調用返回值的話,就會調用失敗
但如果將 通過函數獲取的C++參數綁定到一個變量上,qml通過變量來獲取C++參數的話,也是可以的。如下:
二、QML界面顯示順序
qml會先將界面中的控件加載完成再顯示,加載的順序并不是界面的顯示順序,界面顯示的順序是由上到下的!!! 如下代碼,實現一個點擊編輯框后彈出鍵盤,同時整個界面整體往上推,將編輯框顯示在鍵盤外面,以至不被鍵盤隱藏住
子界面會先顯示出來,title后顯示,當然人眼肯定是看不出來顯示順序的。如果想實現點擊編輯框,彈出鍵盤,同時將子界面往上移,但又不能超過title的功能,就需要將title放置在子界面的下面或將title的z調高,因為鍵盤往上推的時候,實際是改變了子界面的y,那么在改變后重新顯示的時候,如果title與子界面有了重疊,按照顯示順序,title要是在上面就會被子界面覆蓋掉(看著是被一起往上推了,實則是被覆蓋住了)