每个QML对象类型都有一组定义的属性。使用为该对象类型定义的属性集创建对象类型的每个实例。可以指定几种不同的属性,如下所述。
对象声明中的属性
QML文档中的对象声明定义了一种新类型。它还声明了一个对象层次结构,如果创建该新定义类型的实例,则将实例化该对象层次结构。
QML对象类型属性类型的集合如下:
· ID属性
· property属性
· 信号属性
· 信号处理程序属性
· 方法属性
· 附加属性和附加信号处理程序属性
· 枚举属性
这些属性将在下面详细讨论。
ID属性
每个QML对象类型都有一个唯一的id属性。此属性由语言本身提供,并且不能由任何QML对象类型重新定义或覆盖。
可以将值分配给对象实例的id属性,以允许该对象被其他对象标识和引用。id必须以小写字母或下划线开头,并且不能包含字母,数字和下划线以外的字符。
下面是一个TextInput对象和一个Text对象。该的TextInput对象的id值设置为"myTextInput"。该文本对象设置其text属性就是等同TextInput的text属性,参考myTextInput.text。现在,两个项目将显示相同的文本:
import QtQuick 2.0 Column { width: 200; height: 200 TextInput { id: myTextInput; text: "Hello World" } Text { text: myTextInput.text } }
可以在声明对象id的组件范围内的任何位置引用该对象。因此,id值在其组成范围内必须始终是唯一的。
创建对象实例后,无法更改其id属性的值。尽管它看起来像是普通属性,但该id属性不是普通property属性,并且特殊语义适用于此属性;例如,myTextInput.id在上面的示例中无法访问。
property属性
property是可以分配静态值或绑定到动态表达式的对象的属性。一个property的值可以被其他对象读取。通常,它也可以由另一个对象修改,除非特定的QML类型明确禁止特定property使用。
定义property属性
通过注册类的Q_PROPERTY,然后再向QML类型系统注册,可以在C ++中为类型定义property。或者,可以使用以下语法在QML文档的对象声明中定义对象类型的自定义property:
[ default] property < propertyType > < propertyName >
这样,对象声明可以将特定的值暴露给外部对象,或者更容易维护一些内部状态。
property名称必须以小写字母开头,并且只能包含字母,数字和下划线。JavaScript保留字不是有效的属性名称。该default关键字是可选的,并修改所声明的property的语义。
声明自定义属性会隐式创建该属性的值更改信号,以及一个名为on <PropertyName> Changed的关联信号处理程序,其中<PropertyName>是属性的名称,首字母大写。
例如,以下对象声明定义了一个从Rectangle基本类型派生的新类型。它具有两个新属性,并为这些新属性之一实现了信号处理程序:
Rectangle { property color previousColor property color nextColor onNextColorChanged: console.log("The next color will be: " + nextColor.toString()) }
自定义属性定义中的有效类型
除枚举类型外,任何QML基本类型都可用作自定义属性类型。例如,这些都是有效的属性声明:
Item { property int someNumber property string someString property url someUrl }
(枚举值只是整数值,可以用int类型来引用。)
QtQuick模块提供了一些基本类型,因此除非导入模块,否则它们不能用作属性类型。
请注意,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类型,则type属性ColorfulButton也将有效。
将值分配给property属性
可以通过两种不同的方式指定对象实例的属性的值:
· 初始化时的值分配
· 必要的值分配
无论哪种情况,该值都可以是静态值或绑定表达式值。
初始化时的值分配
在初始化时为属性分配值的语法是:
< propertyName >:<值>
如果需要,可以将初始化值分配与对象声明中的属性定义组合。在这种情况下,属性定义的语法变为:
[ default] property < propertyType > < propertyName >:<值>
属性值初始化的示例如下:
import QtQuick 2.0 Rectangle { color: "red" property color nextColor: "blue" // combined property declaration and initialization}
命令性值分配
命令性值分配是将属性值(静态值或绑定表达式)从命令性JavaScript代码分配给属性的地方。强制性值赋值的语法只是JavaScript赋值运算符,如下所示:
[ < objectId > .] < propertyName > =值
强制性值分配的示例如下:
import QtQuick 2.0 Rectangle { id: rect Component.onCompleted: { rect.color = "red" }}
静态值和绑定表达式值
如前所述,可以为属性分配两种值:静态值和绑定表达式值。后者也称为属性绑定。
这是一个示例,显示了两种分配给属性的值:
import QtQuick 2.0 Rectangle { // both of these are static value assignments on initialization width: 400 height: 200 Rectangle { // both of these are binding expression value assignments on initialization width: parent.width / 2 height: parent.height }}
注意:要强制分配绑定表达式,绑定表达式必须包含在传递给Qt.binding()的函数中,然后必须将Qt.binding()返回的值分配给该属性。相反,在初始化时分配绑定表达式时,不得使用Qt.binding()。
类型安全
属性是类型安全的。只能为属性分配与属性类型匹配的值。
例如,如果一个属性是一个实数,并且如果您尝试为其分配一个字符串,则会出现错误:
property int volume:" four" //产生错误;该属性的对象将不会加载
同样,如果在运行时为属性分配了错误类型的值,则不会分配新值,并且会生成错误。
某些属性类型没有自然值表示形式,对于这些属性类型,QML引擎自动执行字符串到类型值的转换。因此,例如,即使color类型的属性存储颜色而不是字符串,您也可以将字符串分配给"red"color属性,而不会报告错误。
有关默认支持的属性类型的列表,请参见QML基本类型。另外,任何可用的QML对象类型也可以用作属性类型。
特殊Property 类型
对象列表Property属性
一个列表类型属性可被分配QML对象类型值的列表。定义对象列表值的语法是用方括号括起来的逗号分隔列表:
[ <item 1>, <item 2>, ... ]
例如,Item类型具有一个states属性,该属性用于保存State类型对象的列表。下面的代码将该属性的值初始化为三个State对象的列表:
import QtQuick 2.0 Item { states: [ State { name: "loading" }, State { name: "running" }, State { name: "stopped" } ]}
如果列表包含单个项目,则可以省略方括号:
import QtQuick 2.0 Item { states: State { name: "running" }}
一个列表类型属性可以与下面的语法的对象声明中指定:
[default] property list<<objectType>> propertyName
并且,与其他属性声明一样,可以使用以下语法将属性初始化与属性声明结合使用:
[default] property list<<objectType>> propertyName: <value>
列表属性声明的示例如下:
import QtQuick 2.0 Rectangle { // declaration without initialization property list<Rectangle> siblingRects // declaration with initialization property list<Rectangle> childRects: [ Rectangle { color: "red" }, Rectangle { color: "blue"} ]}
如果您希望声明一个属性来存储值列表,这些列表不一定是QML对象类型的值,则应该声明一个var属性。
分组属性
在某些情况下,属性包含一组逻辑的子属性属性。可以使用点符号或组符号将这些子属性属性分配给它们。
例如," 文本"类型具有字体组属性。下面,第一个Text对象font使用点表示法初始化其值,而第二个对象使用组表示法:
Text { //dot notation font.pixelSize: 12 font.b: true} Text { //group notation font { pixelSize: 12; b: true }}
分组属性类型是具有子属性的基本类型。这些基本类型中的一些是由QML语言提供的,而其他一些仅在导入Qt Quick模块时才可以使用。