QML中的屬性別名類似C++的引用,與普通的屬性定義有所不同,屬性別名不需要分配新的存儲空間,而是將新聲明的屬性(稱為別名屬性)作為一個已經存在的屬性(被別名的屬性)的直接引用,換句話說,我們給已經存在的屬性定義一個別名,以后再次使用這個屬性的時候便可以通過這個屬性別名來訪問它了。屬性別名的聲明與屬性的聲明類似,但是需要使用alias關鍵字代替屬性類型,並且在屬性聲明的右側必須是一個有效的別名引用。語法如下所示:
property alias<name> : <alias reference>
與普通屬性不同的是,別名屬性只能引用到其聲明處類型作用域中的一個對象或一個對象的屬性,它不能包含任何JavaScript表達式,也不能引用類型作用域之外的對象。另外當第一次聲明別名時,alias reference必須提供,這一點與C++中的引用也非常的類似。
在使用屬性別名時,需要注意下面兩點:
(1).屬性別名在整個組件初始化完畢之后才是可用的:代碼是從上向下執行的,因此一個比較常見的錯誤是,在引用所指向的屬性還沒初始化的時候就使用了別名。
(2).別名不能使用在同一個組件中聲明的另一個別名。
(3).屬性別名可以與現有的屬性同名,但會覆蓋現有屬性。
如下面實例所示:
import QtQuick 2.3 import QtQuick.Controls 1.2 ApplicationWindow { visible: true width: 640 height: 480 title: qsTr("QML語法") Rectangle{ id:coloredRectangle property alias color: blueRectangle.color color: "red" Rectangle{ id:blueRectangle color:"#1234ff" } Component.onCompleted:{ console.log(coloredRectangle.color) setInternalColor() console.log(coloredRectangle.color) coloredRectangle.color = "#884646" console.log(coloredRectangle.color) } //內部函數訪問內部屬性 function setInternalColor(){ color = "#111111" } } }
打印結果:
代碼中Rectangle中聲明了一個color別名屬性,它的名稱與內建的Rectangle:color屬性相同,使用該組件的任何對象引用color屬性時(例如代碼中的coloredRectangle.color)都是使用的別名,而不是一般的Rectangle:color屬性,但是在組件內部直接使用color屬性時,引用的是真實定義的屬性,而不是別名。