網(wǎng)站建設123上海seo顧問推推蛙
QML- 對象屬性
- 一、概述
- 二、id 屬性
- 三、Property 屬性
- 1. 定義屬性
- 1. 自定義屬性定義中的有效類型
- 2. 為屬性屬性賦值
- 1. 初始化時的值賦值
- 2. 命令式賦值
- 3. 靜態(tài)值和綁定表達式值
- 4. 類型安全
- 5. 特殊屬性類型
- 1. 對象列表屬性
- 2. 分組屬性
- 6. 屬性別名
- 1. 屬性別名的注意事項
- 2. 屬性別名和類型
- 7. 默認屬性
- 8. 只讀屬性
- 9. 屬性修飾符對象
- 四、Signal 屬性
- 1. 定義信號屬性
- 2. 屬性變化信號
- 五、Signal Handler
- 1. 屬性更改信號處理程序
- 六、Method 屬性
- 1. 定義方法屬性
- 2. 附加屬性和附加信號處理程序
- 3. 關于訪問附加屬性和信號處理程序的說明
- 六、Enumeration 屬性
一、概述
每個QML對象類型都有一組已定義的屬性。每個實例都是由一組為該對象類型定義的屬性創(chuàng)建的??梢灾付◣追N不同類型的屬性,其實就是屬性就是描述這個對象具體的一些特性,QML 引擎就會根據(jù)這個對象的屬性來繪制界面。
QML文檔中的對象聲明定義了一個新類型。它還聲明了一個對象層次結構,當新定義的類型的實例被創(chuàng)建時,該對象層次結構將被實例化。
QML object-type屬性類型集合如下:
-
id
-
property
-
signal
-
signal handler attributes
-
method attributes
-
attached properties and attached signal handler attributes
-
enumeration attributes
下面就是這些屬性的詳細說明
二、id 屬性
每個QML對象類型都只有一個id屬性。此屬性由語言本身提供,不能由任何QML對象類型重新定義或覆蓋。
我們可以為對象實例的id屬性賦值,以允許其他對象識別和引用該對象。必須以小寫字母或下劃線開頭,且不能包含字母、數(shù)字和下劃線以外的字符。
下面是一個TextInput對象和一個Text對象。TextInput對象的id值設置為"myTextInput"。通過引用myTextInput.text, Text對象將其Text屬性設置為與TextInput的Text屬性相同的值?,F(xiàn)在,兩個項目將顯示相同的文本:
import QtQuick 2.0Column {width: 200; height: 200TextInput { id: myTextInput; text: "Hello World" }Text { text: myTextInput.text }
}
在聲明對象的組件作用域中,任何地方都可以通過其id引用對象。因此,id值在其組件范圍內必須始終是唯一的。有關更多信息,請參見作用域和命名解析。
一旦創(chuàng)建對象實例,其id屬性的值就不能改變。雖然它看起來像一個普通的屬性,但id屬性不是一個普通的屬性,并且對它應用了特殊的語義;例如,無法訪問myTextInput。上面例子中的Id。
三、Property 屬性
屬性是對象的屬性,它可以被賦予靜態(tài)值或綁定到動態(tài)表達式。屬性的值可以被其他對象讀取。通常,它也可以由另一個對象修改,除非特定的QML類型明確禁止對特定屬性進行修改。
1. 定義屬性
在c++中,通過注冊類的Q_PROPERTY,然后將其注冊到QML類型系統(tǒng),可以為類型定義屬性。或者,可以在QML文檔的對象聲明中定義對象類型的自定義屬性,語法如下:
[default] property <propertyType> <propertyName>
通過這種方式,對象聲明可以將特定值暴露給外部對象,或者更容易維護某些內部狀態(tài)。
屬性名必須以小寫字母開頭,且只能包含字母、數(shù)字和下劃線。JavaScript保留字不是有效的屬性名。default關鍵字是可選的,它會修改屬性聲明的語義。有關默認屬性修飾符的更多信息,請參見即將介紹的默認屬性部分。
聲明自定義屬性會隱式地為該屬性創(chuàng)建一個值改變信號,以及調用 < PropertyName > Changed 時的關聯(lián)信號處理程序,其中 < PropertyName > 是屬性的名稱,第一個字母大寫。
例如,下面的對象聲明定義了派生自Rectangle基類型的新類型。它有兩個新屬性,并為其中一個屬性實現(xiàn)了一個信號處理程序:
Rectangle {property color previousColorproperty color nextColoronNextColorChanged: console.log("The next color will be: " + nextColor.toString())
}
1. 自定義屬性定義中的有效類型
除了枚舉類型之外,任何QML基本類型都可以用作自定義屬性類型。例如,這些都是有效的屬性聲明:
Item {property int someNumberproperty string someStringproperty url someUrl
}
(枚舉值就是整數(shù),可以用int類型引用。)
一些基本類型由QtQuick模塊提供,因此除非導入該模塊,否則不能用作屬性類型。有關更多細節(jié),請參閱QML基本類型文檔。
注意,基本類型var是一個通用的占位類型,可以保存任何類型的值,包括列表和對象:
property var someNumber: 1.5
property var someString: "abc"
property var someBool: true
property var someList: [1, 2, "three", "four"]
property var someObject: Rectangle { width: 100; height: 100; color: "red" }
此外,任何QML對象類型都可以用作屬性類型。例如:
property Item someItem
property Rectangle someRectangle
這也適用于自定義QML類型。如果在名為ColorfulButton的文件中定義了QML類型。qml(在客戶端導入的目錄中),那么ColorfulButton類型的屬性也是有效的。
2. 為屬性屬性賦值
對象實例屬性的值可以用兩種不同的方式指定。
- 初始化時的值賦值
- 命令式的賦值
在這兩種情況下,值可以是靜態(tài)值,也可以是綁定表達式值。
1. 初始化時的值賦值
在初始化時給屬性賦值的語法如下:
<propertyName> : <value>
如果需要,初始化值的賦值可以與對象聲明中的屬性定義結合使用。在這種情況下,屬性定義的語法如下:
[default] property <propertyType> <propertyName> : <value>
下面是屬性值初始化的例子:
import QtQuick 2.0Rectangle {color: "red"property color nextColor: "blue" // combined property declaration and initialization
}
2. 命令式賦值
命令式賦值是指在命令式JavaScript代碼中將屬性的值(靜態(tài)值或綁定表達式)賦給屬性。命令式的賦值語法就是JavaScript的賦值操作符,如下所示:
[<objectId>.]<propertyName> = value
下面是命令式賦值的一個例子:
import QtQuick 2.0Rectangle {id: rectComponent.onCompleted: {rect.color = "red"}
}
3. 靜態(tài)值和綁定表達式值
如前所述,有兩種類型的值可以賦給屬性:靜態(tài)值和綁定表達式值。后者也稱為屬性綁定。
- 靜態(tài)值 :不依賴于其他屬性的常量值。
- 綁定表達式:描述屬性與其他屬性之間關系的JavaScript表達式。這個表達式中的變量稱為屬性的依賴項。
QML引擎強化屬性與其依賴項之間的關系。當任何依賴項的值發(fā)生變化時,QML引擎自動重新計算綁定表達式,并將新的結果分配給屬性。
下面的例子展示了兩種值都被賦給屬性:
import QtQuick 2.0Rectangle {// both of these are static value assignments on initializationwidth: 400height: 200Rectangle {// both of these are binding expression value assignments on initializationwidth: parent.width / 2height: parent.height}
}
注意:要命令式地分配綁定表達式,綁定表達式必須包含在傳遞給Qt.binding()的函數(shù)中,然后必須將Qt.binding()返回的值分配給屬性。相反,Qt.binding()在初始化時賦值綁定表達式時不能使用。有關更多信息,請參見屬性綁定。
4. 類型安全
Properties 是類型安全的。只能為屬性指定與屬性類型匹配的值。
例如,如果一個屬性是一個實值,而你試圖將一個字符串賦值給它,就會得到錯誤:
property int volume: "four" // generates an error; the property's object will not be loaded
同樣,如果在運行時為屬性分配了錯誤類型的值,則不會分配新值,并且會產(chǎn)生錯誤。
有些屬性類型沒有自然的值表示,對于這些屬性類型,QML引擎自動執(zhí)行字符串到類型值的轉換。例如,即使color類型的屬性存儲的是顏色而不是字符串,你也可以將字符串 “red” 賦值給 color 屬性,而不會報錯。
有關默認支持的屬性類型的列表,請參閱QML基本類型。此外,任何可用的QML對象類型也可以用作屬性類型。
5. 特殊屬性類型
1. 對象列表屬性
可以將QML對象類型值的列表分配給列表類型屬性。定義對象列表值的語法是一個用逗號分隔的列表,并用方括號括起來:
[ <item 1>, <item 2>, ... ]
例如,Item類型有一個states屬性,用于保存狀態(tài)類型對象的列表。下面的代碼將這個屬性的值初始化為三個狀態(tài)對象的列表:
import QtQuick 2.0Item {states: [State { name: "loading" },State { name: "running" },State { name: "stopped" }]
}
如果列表只包含一個元素,可以省略方括號:
import QtQuick 2.0Item {states: State { name: "running" }
}
列表類型屬性可以在對象聲明中指定,語法如下:
[default] property list<<objectType>> propertyName
和其他屬性聲明一樣,屬性初始化也可以和屬性聲明結合使用,語法如下:
[default] property list<<objectType>> propertyName: <value>
下面是一個聲明list屬性的例子:
import QtQuick 2.0Rectangle {// declaration without initializationproperty list<Rectangle> siblingRects// declaration with initializationproperty list<Rectangle> childRects: [Rectangle { color: "red" },Rectangle { color: "blue"}]
}
如果您希望聲明一個屬性來存儲一個不一定是QML對象類型值的值列表,則應該聲明一個var屬性。
2. 分組屬性
在某些情況下,屬性包含一組邏輯上的子屬性。這些子屬性可以使用點表示法或組表示法來指定。
例如,Text類型有一個font group屬性。下面,第一個Text對象使用句點表示法初始化其字體值,而第二個使用分組表示法:
Text {//dot notationfont.pixelSize: 12font.b: true
}Text {//group notationfont { pixelSize: 12; b: true }
}
分組屬性類型是具有子屬性的基本類型。其中一些基本類型由QML語言提供,而其他類型可能只在導入Qt Quick模塊時使用。有關QML基本類型的更多信息,請參閱文檔。
6. 屬性別名
屬性別名是持有對另一個屬性的引用的屬性。普通屬性定義為屬性分配新的、唯一的存儲空間,而屬性別名將新聲明的屬性(稱為別名屬性)連接為對現(xiàn)有屬性(別名屬性)的直接引用。
屬性別名聲明看起來與普通屬性定義類似,不同之處在于它需要alias關鍵字而不是屬性類型,而且屬性聲明的右側必須是有效的別名引用:
[default] property alias <name>: <alias reference>
與普通屬性不同,別名有以下限制。
- 它只能引用聲明別名的類型范圍內的對象或對象的屬性。
- 它不能包含任意的JavaScript表達式
- 它不能引用在其類型作用域之外聲明的對象。
- 別名引用不是可選的,這與普通屬性的optional默認值不同;在第一次聲明別名時,必須提供別名引用。
- 它不能引用附加的屬性。
- 它不能引用深度大于等于3的層次結構中的屬性。下面的代碼不起作用:
property alias color: myItem.myRect.border.colorItem {id: myItemproperty Rectangle myRect}
不過,至多兩層深度的屬性別名也可以。
property alias color: rectangle.border.colorRectangle {id: rectangle
}
例如,下面是一個以buttonText為別名的按鈕類型,它連接到text子元素的text對象:
// Button.qml
import QtQuick 2.0Rectangle {property alias buttonText: textItem.textwidth: 100; height: 30; color: "yellow"Text { id: textItem }
}
下面的代碼將創(chuàng)建一個按鈕,并為子text對象定義一個文本字符串:
Button { buttonText: "Click Me" }
在這里,修改buttonText會直接修改textItem。文本值;它不會改變其他值,然后更新textItem.text。如果buttonText不是別名,改變它的值實際上根本不會改變顯示的文本,因為屬性綁定不是雙向的:如果textItem是雙向的,buttonText的值就會改變。文本被改變了,但沒有反過來。
1. 屬性別名的注意事項
只有在組件完全初始化之后,才會激活別名。引用未初始化的別名時會產(chǎn)生錯誤。同樣,別名屬性也會導致錯誤。
property alias widgetLabel: label//will generate an error
//widgetLabel.text: "Initial text"//will generate an error
//property alias widgetLabelText: widgetLabel.textComponent.onCompleted: widgetLabel.text = "Alias completed Initialization"
然而,當在根對象中導入帶有屬性別名的QML對象類型時,該屬性會作為常規(guī)Qt屬性出現(xiàn),因此可以在別名引用中使用。
別名屬性可以與現(xiàn)有屬性具有相同的名稱,從而有效地覆蓋現(xiàn)有屬性。例如,下面的QML類型有一個color alias屬性,其名稱與內置的Rectangle::color屬性相同:
Rectangle {id: coloredrectangleproperty alias color: bluerectangle.colorcolor: "red"Rectangle {id: bluerectanglecolor: "#1234ff"}Component.onCompleted: {console.log (coloredrectangle.color) //prints "#1234ff"setInternalColor()console.log (coloredrectangle.color) //prints "#111111"coloredrectangle.color = "#884646"console.log (coloredrectangle.color) //prints #884646}//internal function that has access to internal propertiesfunction setInternalColor() {color = "#111111"}
}
任何使用此類型并引用其color屬性的對象,都將引用別名,而不是普通的Rectangle::color屬性。但在內部,矩形可以正確地設置它的color屬性,并引用實際定義的屬性而不是別名。
2. 屬性別名和類型
屬性別名不能具有顯式類型規(guī)范。屬性別名的類型是它引用的屬性或對象的聲明類型。因此,如果你通過id引用一個對象,并在內聯(lián)聲明了額外的屬性,那么這些額外的屬性將無法通過別名訪問:
// MyItem.qml
Item {property alias inner: innerItemItem {id: innerItemproperty int extraProperty}}
不能初始化inner。這個組件外部的extraProperty,因為inner只是一個元素:
// main.qml
MyItem {inner.extraProperty: 5 // fails
}
但是,如果您使用專用的。qml文件將內部對象提取到一個單獨的組件中,則可以實例化該組件,并通過別名提供其所有屬性:
// MainItem.qmlItem {// Now you can access inner.extraProperty, as inner is now an ExtraItemproperty alias inner: innerItemExtraItem {id: innerItem}}// ExtraItem.qmlItem {property int extraProperty}
7. 默認屬性
對象定義可以只有一個默認屬性。默認屬性是指在另一個對象的定義中聲明一個對象,而沒有聲明該對象為某個特定屬性的值時,賦值給該對象的屬性。
用可選關鍵字default聲明屬性會將其標記為default屬性。例如,假設有一個文件MyLabel。帶有默認屬性someText的qml:
// MyLabel.qmlimport QtQuick 2.0Text {default property var someTexttext: "Hello, " + someText.text}
可以在MyLabel對象的定義中指定someText值,如下所示:
MyLabel {Text { text: "world!" }}
這與下面代碼的效果完全相同:
MyLabel {someText: Text { text: "world!" }
}
不過,由于someText屬性已經(jīng)被標記為默認屬性,因此沒有必要顯式地將Text對象賦給這個屬性。
你會注意到,子對象可以添加到任何基于item的類型中,而無需顯式地添加到children屬性中。這是因為Item的默認屬性是它的data屬性,任何為Item添加到這個列表中的項都會自動添加到其子列表中。
默認屬性在為子項重新賦值時很有用。請參閱TabWidget示例,它使用一個默認屬性自動將TabWidget的子組件重新分配為內部ListView的子組件。請參見擴展QML。
8. 只讀屬性
對象聲明可以使用readonly關鍵字定義只讀屬性,語法如下:
readonly property <propertyType> <propertyName> : <initialValue>
只讀屬性必須在初始化時賦值。在只讀屬性初始化之后,無論通過命令式代碼還是其他方式,都無法再給它賦值。
例如,組件中的代碼。下面的onCompleted塊是無效的:
Item {readonly property int someNumber: 10Component.onCompleted: someNumber = 20 // doesn't work, causes an error}
注意:只讀屬性不能也是默認屬性。
9. 屬性修飾符對象
屬性可以有與其關聯(lián)的屬性值修改器對象。聲明與特定屬性關聯(lián)的屬性修飾符類型的實例的語法如下:
<PropertyModifierTypeName> on <propertyName> {// attributes of the object instance}
需要注意的是,上面的語法實際上是一個對象聲明,它將實例化一個作用于預先存在的屬性的對象。
某些屬性修飾符類型可能只適用于特定的屬性類型,但語言并沒有強制要求這樣做。例如,QtQuick提供的NumberAnimation類型只會對數(shù)值類型(例如int或real)的屬性進行動畫。使用非數(shù)值屬性的NumberAnimation不會導致錯誤,但非數(shù)值屬性不會產(chǎn)生動畫。屬性修飾符類型與特定屬性類型關聯(lián)時的行為是由其實現(xiàn)定義的。
四、Signal 屬性
信號是對象發(fā)出的通知,表示某些事件發(fā)生了:例如,屬性發(fā)生了變化,動畫開始或停止,或者圖像下載完畢。例如,當用戶在鼠標區(qū)域內單擊時,MouseArea類型就會發(fā)出單擊信號。
無論何時發(fā)出特定的信號,都可以通過信號處理程序通知對象。信號處理程序使用語法on< signal >聲明,其中< signal >是信號的名稱,第一個字母大寫。信號處理程序必須在發(fā)出信號的對象的定義中聲明,而且處理程序應該包含調用信號處理程序時要執(zhí)行的JavaScript代碼塊。
例如,下面的onClicked信號處理程序是在MouseArea對象定義中聲明的,它會在單擊MouseArea時被調用,從而打印出一條控制臺消息:
import QtQuick 2.0Item {width: 100; height: 100MouseArea {anchors.fill: parentonClicked: {console.log("Click!")}}}
1. 定義信號屬性
在c++中,可以通過注冊類的Q_SIGNAL來為類型定義信號,然后將該信號注冊到QML類型系統(tǒng)?;蛘?#xff0c;對象類型的自定義信號可以在QML文檔的對象聲明中定義,語法如下:
signal <signalName>[([<type> <parameter name>[, ...]])]
試圖在同一個類型塊中聲明兩個同名的信號或方法是錯誤的。但新信號可以重用該類型上現(xiàn)有信號的名稱。(這樣做時應謹慎,因為現(xiàn)有信號可能被隱藏,無法訪問。)
下面是三個信號聲明的例子:
import QtQuick 2.0Item {signal clickedsignal hovered()signal actionPerformed(string action, var actionResult)
}
如果信號沒有參數(shù),“()”括號是可選的。如果使用了參數(shù),則必須聲明參數(shù)類型,如上面的actionPerformed信號的string和var參數(shù)。允許的參數(shù)類型與此頁上定義屬性屬性下列出的參數(shù)類型相同。
要發(fā)射信號,請將其作為方法調用。在信號發(fā)出時,將調用任何相關的信號處理程序,處理程序可以使用定義的信號參數(shù)名稱來訪問相應的參數(shù)。
2. 屬性變化信號
QML類型還提供內置的屬性變化信號,每當屬性值發(fā)生變化時就會發(fā)出這種信號,如前面在屬性屬性一節(jié)中所述。有關這些信號為什么有用以及如何使用它們的更多信息,請參閱即將介紹屬性更改信號處理程序的部分。
五、Signal Handler
信號處理程序是一種特殊的方法屬性,每當發(fā)出相關的信號時,QML引擎就會調用方法實現(xiàn)。在QML中向對象定義添加信號將自動向對象定義添加關聯(lián)的信號處理程序,該對象定義默認具有空實現(xiàn)。客戶端可以提供實現(xiàn),實現(xiàn)程序邏輯。
考慮下面的SquareButton類型,其定義在SquareButton中。QML文件如下所示,包含激活和停用的信號:
// SquareButton.qmlRectangle {id: rootsignal activated(real xPosition, real yPosition)signal deactivatedproperty int side: 100width: side; height: sideMouseArea {anchors.fill: parentonPressed: root.activated(mouse.x, mouse.y)onReleased: root.deactivated()}}
這些信號可以由同一目錄中的另一個QML文件中的任何SquareButton對象接收,其中信號處理程序的實現(xiàn)由客戶端提供:
// myapplication.qmlSquareButton {onActivated: console.log("Activated at " + xPosition + "," + yPosition)onDeactivated: console.log("Deactivated!")}
有關信號使用的更多細節(jié),請參閱信號和處理程序事件系統(tǒng)。
1. 屬性更改信號處理程序
用于屬性更改的信號處理程序采用< property >Changed上的語法形式,其中< property >是屬性的名稱,第一個字母大寫。例如,雖然TextInput類型的文檔中沒有記錄textChanged信號,但這個信號是隱式可用的,因為TextInput有一個text屬性,所以可以編寫一個onTextChanged信號處理程序,每當這個屬性發(fā)生變化時調用:
import QtQuick 2.0TextInput {text: "Change this!"onTextChanged: console.log("Text has changed to:", text)}
六、Method 屬性
對象類型的方法是一個函數(shù),它可以被調用來執(zhí)行某些處理或觸發(fā)進一步的事件??梢詫⒎椒ㄟB接到信號,以便在信號發(fā)出時自動調用該方法。有關詳細信息,請參閱信號和處理程序事件系統(tǒng)。
1. 定義方法屬性
在c++中,通過標記一個類的函數(shù),然后用Q_INVOKABLE注冊到QML類型系統(tǒng),或者將它注冊為類的Q_SLOT,可以為一個類型定義方法。另外,還可以在QML文檔的對象聲明中添加自定義方法,語法如下:
function <functionName>([<parameterName>[, ...]]) { <body> }
QML類型中可以添加方法,以便定義獨立的、可重用的JavaScript代碼塊。這些方法既可以在內部調用,也可以由外部對象調用。
與信號不同,方法的參數(shù)類型不必聲明,因為它們默認為var類型。
試圖在同一個類型塊中聲明兩個同名的方法或信號是錯誤的。不過,新方法可以重用該類型上已有方法的名稱。(這樣做應該謹慎,因為現(xiàn)有的方法可能被隱藏,變得不可訪問。)
下面是一個包含calculateHeight()方法的矩形,在指定height值時調用該方法:
import QtQuick 2.0Rectangle {id: rectfunction calculateHeight() {return rect.width / 2;}width: 100height: calculateHeight()}
如果方法有參數(shù),則可以通過方法內的名稱訪問參數(shù)。下面,當單擊MouseArea時,它會調用moveTo()方法,然后該方法可以引用接收到的newX和newY參數(shù)來重新定位文本:
import QtQuick 2.0Item {width: 200; height: 200MouseArea {anchors.fill: parentonClicked: label.moveTo(mouse.x, mouse.y)}Text {id: labelfunction moveTo(newX, newY) {label.x = newX;label.y = newY;}text: "Move me!"}}
2. 附加屬性和附加信號處理程序
附加屬性和附加信號處理程序是一種機制,使對象能夠使用對象無法使用的額外屬性或信號處理程序進行注釋。特別是,它們允許對象訪問與單個對象特別相關的屬性或信號。
QML類型實現(xiàn)可以選擇在c++中用特定的屬性和信號創(chuàng)建附加類型。然后,可以在運行時創(chuàng)建此類型的實例并將其附加到特定對象,從而允許這些對象訪問附加類型的屬性和信號。訪問這些屬性時,需要在屬性和對應的信號處理程序前添加附加類型的名稱。
對附加的屬性和處理程序的引用采用以下語法形式:
<AttachingType>.<propertyName>
<AttachingType>.on<SignalName>
例如,ListView類型有一個附加屬性ListView。isCurrentItem,可用于ListView中的每個委托對象。它可以被每個委托對象用來確定它是否是視圖中的當前選中項:
import QtQuick 2.0ListView {width: 240; height: 320model: 3delegate: Rectangle {width: 100; height: 30color: ListView.isCurrentItem ? "red" : "yellow"}}
在這個例子中,附加類型的名稱是ListView,屬性是isCurrentItem,因此附加屬性被稱為ListView.isCurrentItem。
附加的信號處理程序也以同樣的方式引用。例如,組件。onCompleted附加信號處理程序通常用于在組件的創(chuàng)建過程完成時執(zhí)行一些JavaScript代碼。在下面的例子中,一旦ListModel被完全創(chuàng)建,它的組件。onCompleted信號處理程序將自動被調用以填充模型:
import QtQuick 2.0ListView {width: 240; height: 320model: ListModel {id: listModelComponent.onCompleted: {for (var i = 0; i < 10; i++)listModel.append({"Name": "Item " + i})}}delegate: Text { text: index }}
由于附加類型的名稱是Component,并且該類型有一個completed信號,因此附加的信號處理程序稱為Component. oncompleted。
3. 關于訪問附加屬性和信號處理程序的說明
一個常見的錯誤是,假定附加的屬性和信號處理程序可以從附加這些屬性的對象的子對象直接訪問。事實并非如此。附加類型的實例只附加到特定的對象上,而不附加到對象及其所有子對象上。
例如,下面是前面示例涉及附加屬性的修改版本。這一次,委托是一個項,而著色矩形是該項的子元素:
import QtQuick 2.0ListView {width: 240; height: 320model: 3delegate: Item {width: 100; height: 30Rectangle {width: 100; height: 30color: ListView.isCurrentItem ? "red" : "yellow" // WRONG! This won't work.}}}
這不能按預期工作,因為ListView。isCurrentItem只被附加到根委托對象,而不是它的子委托對象。由于Rectangle是委托的子元素,而不是委托本身,因此它無法通過ListView.isCurrentItem訪問isCurrentItem附加屬性。因此,矩形應該通過根委托訪問isCurrentItem:
ListView {//....delegate: Item {id: delegateItemwidth: 100; height: 30Rectangle {width: 100; height: 30color: delegateItem.ListView.isCurrentItem ? "red" : "yellow" // correct}}}
現(xiàn)在delegateItem.ListView.isCurrentItem正確地引用了委托的isCurrentItem屬性。
六、Enumeration 屬性
枚舉提供了一組固定的命名選項。它們可以在QML中使用enum關鍵字聲明:
// MyText.qml
Text {enum TextType {Normal,Heading}
}
如上所示,枚舉類型(例如TextType)和值(例如Normal)必須以大寫字母開頭。
值通過.引用。<值>或<類型>。<值>。
// MyText.qml
Text {enum TextType {Normal,Heading}property int textType: MyText.TextType.Normalfont.bold: textType == MyText.TextType.Headingfont.pixelSize: textType == MyText.TextType.Heading ? 24 : 12
}
屬性int文本類型:MyText.TextType.Normal
字體。粗體:textType == MyText.TextType.Heading
字體。pixelSize: textType == MyText.TextType.Heading ?24: 12
}
有關QML中枚舉用法的更多信息可以在QML基本類型枚舉文檔中找到。
QML中聲明枚舉的功能是在Qt 5.10中引入的。