Attached Properties 官方文档介绍: Attached Properties and Attached Signal Handlers
什么是Attached Properties? qml的property(属性)有一些特殊的,如必要属性(Required Properties)、只读属性(Read-Only Properties)、默认属性(Default Properties)、分组属性(Grouped Properties)、属性别名(Property Aliases)、附加属性(Attached Properties)。上述除了属性别名、附加属性以外的属性都是属于所定义的对象类型的,属性别名实质上是子对象属性的引用,属于子对象,而附加属性则属于附加类型(attached type),附加类型也可以理解成一个特殊的子对象(其实例化过程是隐式的)。
Instances of this type(attached type) can then be created and attached to specific objects at run time, allowing those objects to access the properties and signals of the attaching type. These are accessed by prefixing the properties and respective signal handlers with the name of the attaching type.
attached type(attached properties and signals)在运行时被创建并附加到指定的对象,被指定的对象可以通过以下方式访问附加属性
< AttachingType >.< propertyName > < AttachingType >.on< SignalName >
注意事项:附加属性只能被所属的对象访问,而不能被这个对象的child访问,或者作为属性别名暴露出去也是不允许的
一些qml的对象就有附加属性,可以通过说明查看“Attached Properties”一栏,如 ListView 其中isCurrentItem的用法:
import QtQuick 2.0 ListView { width: 240; height: 320 model: 3 delegate: Rectangle { width: 100; height: 30 color: ListView.isCurrentItem ? "red" : "yellow" } }这里看着有个疑惑:delegate下的Rectangle为什么可以直接访问isCurrentItem,不是说child不能访问附加属性吗?说明里有相关的解释,这个属性刚好也被绑定为delegate的附加属性了 但有的对象说明并没有直接给出附加属性,如 Item的Keys
import QtQuick 2.0 Item { focus: true Keys.onPressed: { if (event.key == Qt.Key_Left) { console.log("move left"); event.accepted = true; } } Keys.onReturnPressed: console.log("Pressed return"); }这里的Keys就是Item下的一个附加类型,Keys本身有一个信号 returnPressed(KeyEvent event),上面的onReturnPressed就是对应的信号处理函数
还有一个隐藏的附加类型Component,所有的qml类型都具有
Rectangle { Component.onCompleted: console.log("Completed Running!") Rectangle { Component.onCompleted: console.log("Nested Completed Running!") } }Component.onCompleted其实是作为附加信号completed()的处理函数,这里的Component就是一个附加类型,每个qml类型(或者说每个.qml文件)实例化的时候都会自动创建一个Component(隐式)。有一种情况是显式创建的,就是通过Component临时定义的类型,结合Loader进行动态加载
定义自己的附加属性要要通过C++的方式:create an attaching type in C++