variant类型是泛型属性类型。它已经过时,只支持旧的应用程序;新的应用程序应该使用var类型属性。
变体类型属性可以保存任何基本类型值:
Item { property variant aNumber: 100 property variant aString: "Hello world!" property variant aBool: false }
在与c++集成时,请注意,从c++传递到QML的任何QVariant值都会自动转换为变量值,反之亦然。
Using Scarce Resources with the variant Type
变体类型属性还可以保存图像或位图。包含QPixmap或QImage的变量被称为“稀缺资源”,声明式引擎将尝试在任何需要复制的JavaScript表达式计算完成后自动释放此类资源。
客户端可以通过在JavaScript中调用variant属性上的“destroy”方法来显式地释放这样的稀缺资源。它们还可以通过在JavaScript中调用变体属性的“preserve”方法来显式地保留稀缺资源。
Storing Arrays and Objects
变体类型也可以保留:
> 基本类型值的数组
> 具有基本类型值的键值对的映射
例如,下面是一个项数组和一个属性映射。可以使用JavaScript for循环检查它们的内容。单独的数组值可以通过索引访问,单独的映射值可以通过键访问:
Item { property variant items: [1, 2, 3, "four", "five"] property variant attributes: { 'color': 'red', 'width': 100 } Component.onCompleted: { for (var i = 0; i < items.length; i++) console.log(items[i]) for (var prop in attributes) console.log(prop, "=", attributes[prop]) } }
虽然这是一种方便的存储数组和映射类型值的方法,但您必须注意,上面的项和属性属性不是QML对象(当然也不是JavaScript对象),属性中的键值对也不是QML属性。相反,items属性保存一个值数组,而attribute保存一组键值对。
此外,由于项和属性不是QML对象,更改它们包含的值不会触发属性更改通知。如果上面的例子有onItemsChanged或onAttributesChanged信号处理程序,那么在为其中任何一个属性中的单个条目赋值时都不会调用它们。但是,如果将项或属性属性本身重新赋值给不同的值,则将调用此类处理程序。
JavaScript程序员还应该注意,当将JavaScript对象复制到数组或映射属性时,复制的是对象的内容(即其键值属性),而不是对象本身。该属性不包含对原始JavaScript对象的引用,并且对象的JavaScript原型链等额外数据也会在过程中丢失。
这个基本类型是由QML语言提供的。