概念
附加属性和附加信号处理器是一种允许对象使用额外的属性或信号处理器的机制。
这个机制允许对象访问一些与个别对象相关的属性或信号,非常有用。
在实习一个QML类型时,可以选择性地创建一个包含特定属性和信号的附加类型。该类型的实例在运行时可以被创建并附加给指定的对象,这样便允许这些对象访问附加类型中的属性和信号。
附加属性和附加信号处理器的语法如下:
<ArrachingType>.<propertyName>
<ArrachingType>.on<SignalName>
1. 附加属性
例如,ListView
类型包含一个附加属性ListView.isCurrentItem
,可以附加到ListView
的每一个委托对象。
这个属性可以让每一个独立的委托对象确定其是否是视图中当前选择的对象。
import QtQuick
ListView{
width: 240
height: 320
model: 3
focus: true
delegate: Rectangle{
width: 240
height: 30
color: ListView.isCurrentItem?"red":"yellow"
}
}
上面的例子中,附加类型的名称是ListView
,而相关的属性是isCurrentItem
,因此需要使用ListView.isCurrentIten
来引用这个属性。
2. 附加信号处理器
附加信号处理器也是类似的。
例如,Component.onCompleted
就是一个附加信号处理器,用于在组件创建完成时执行一些JavaScript代码。
例子,一旦ListModel
完全创建,信号处理器就会被自动调用:
ListView{
width: 240
height: 320
model: ListModel{
id: listModel
Component.onCompleted : {
for(var i=0; i<10;++i){
listModel.append({"Name" : "Item " + i})
}
}
}
delegate: Text{text: index + " " + Name}
}
同样的,因为附加类型completed
属于Component
,因此需要使用Component.onCompleted
引用这个信号处理器。
3. 注意事项
使用附加属性和附加信号处理器的常见错误是,在附加对象的子对象中使用它们。
因为附加类型的实例只是附加到了特定的对象,并不是对象及其所有子对象。
例如,下面的用法是错误的:
ListView{
width: 340
height: 320
model: 3
delegate: Item{
width: 100
height: 30
Rectangle{
width: 100
height: 30
color: ListView.isCurrentItem ? "red" : "yellow"
}
}
}
这里ListView.isCurrentItem
只是附加到了根委托对象,而不是委托对象的子对象。因为Rectangle是委托对象的子对象,所以不能直接通过ListView.isCurrentItem
访问到isCurrentItem
附加属性。
如果要访问,那么要通过根委托对象来完成:
ListView{
width: 340
height: 320
model: 3
delegate: Item{
id: delegateItem
width: 100
height: 30
Rectangle{
width: 100
height: 30
color: delegateItem.ListView.isCurrentItem ? "red" : "yellow"
}
}
}
通过delegateItem.ListView.isCurrentItem
访问了委托中的isCurrentItem
附加属性。