qml中var 类型是可以引用任何数据类型的通用属性类型。
它相当于一个常规的 JavaScript 变量,可以存储数字、字符串、对象、数组和函数等等.
示例:
Item { property var aNumber: 100 property var aBool: false property var aString: "Hello world!" property var anotherString: String("#FF008800") property var aColor: Qt.rgba(0.2, 0.3, 0.4, 0.5) property var aRect: Qt.rect(10, 10, 10, 10) property var aPoint: Qt.point(10, 10) property var aSize: Qt.size(10, 10) property var aVector3d: Qt.vector3d(100, 100, 100) property var anArray: [1, 2, 3, "four", "five", (function() { return "six"; })] property var anObject: { "foo": 10, "bar": 20 } property var aFunction: (function() { return "one"; }) }
需要注意的是,分配给 var 属性的 JavaScript 对象的常规属性的更改不会触发访问它们的绑定的更新。
示例:
Item { property var car: new Object({wheels: 8}) Text { text: "The car has " + car.wheels + " wheels"; } Component.onCompleted: { car.wheels = 12; } }
示例中wheels属性的更改不会重新评估并分配给“文本”属性的绑定,所以文本内容不会变化.
如果 onCompleted 处理处程序改为使用“car = new Object({wheels: 12}),则会使Text文本内容变更,因为这是car本体的变更,所以会发射通知.”
QML 语法定义属性值初始化赋值右侧的花括号表示绑定赋值。这在初始化 var 属性时可能会造成混淆,因为 JavaScript 中的空花括号可以表示表达式块或空对象声明。
如果希望将 var 属性初始化为空对象值,则应将花括号括在括号中。
Item { //绑定到一个空表达式,其结果未定义 property var first: {} // nothing = undefined //属性绑定到包含单个空表达式块 ("{}") 的表达式,该表达式同样具有未定义的结果 property var second: {{}} // empty expression block = undefined //属性绑定到一个表达式,该表达式被评估为一个空对象声明,因此该属性将使用该空对象值进行初始化。 property var third: ({}) // empty object }
类似地,JavaScript 中的冒号可以是对象属性值赋值,也可以是代码标签。 因此,使用对象声明初始化 var 属性也可能需要括号
Item { property var first: { example: 'true' } // example is interpreted as a label property var second: ({ example: 'true' }) // example is interpreted as a property property var third: { 'example': 'true' } // example is interpreted as a property Component.onCompleted: { console.log(first.example) // prints 'undefined', as "first" was assigned a string console.log(second.example) // prints 'true' console.log(third.example) // prints 'true' } }
- QtQuick 1.x
property variant内部是QVariant。 对象被分配给variant变量时则会被转换为QVariantMap。
从javascript访问该属性将导致QVariantMap转换回JS对象。
javascript的函数,特殊的JS值(null,undefined)无法存储在"property
variant"类型的属性中。- QtQuick 2.x
property var内部是javascript值。 property var支持创建javascript的所有内容,包括函数引用。 仅当从C++(通过QObject::property()或QQmlProperty::read())访问时,才会转换为QVariant(将其他JS值转换为QVariant的转换规则相同)。
在C ++端实现类型时,可以将QJSValue类用作属性/方法参数,以在C ++和QML/JS之间传输值,而不会造成类型/数据丢失。- 总结
variant 类型和 var 类型一样在 QML 中都是泛型属性类型。只是 variant 类型已经过时了,仅用于支持旧的应用程序(向后兼容使用);新的 QML 应用程序应该使用 var 类型属性。
所以,除非我们的应用程序还在支持比较老的版本的 Qt,否则不要在 QML 的代码中使用 variant 类型。
下面是使用建议:Qt 4.*
或者QtQuick 1.*
中使用 variant 类型Qt 5.*
或者QtQuick 2.*
中最好使用 var 类型。QML 数组或列表的声明/定义(declaration/definition)可以使用 Qt 4 的 variant 类型或 Qt 5 的 var 类型。但是如果预先知道 myArray 的类型和不可更改的内容,也可以使用属性
list<type>
。