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属性时,引用的是真实定义的属性,而不是别名。