qml var类型详解

简介: qml var类型详解


  • 概述

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 属性 的变更

需要注意的是,分配给 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本体的变更,所以会发射通知.”


  • var 属性值初始化

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'
    }
}

  • variant与var对比
  • 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>

目录
相关文章
|
前端开发 JavaScript 开发者
【QML进阶 进度条设计】打造动态弧形进度条特效
【QML进阶 进度条设计】打造动态弧形进度条特效
749 2
|
缓存 Ubuntu JavaScript
踩坑记录:QML加载图片资源
踩坑记录:QML加载图片资源
2348 0
|
前端开发 JavaScript C++
打造卓越 QML 层级设计:从入门到精通(一)
打造卓越 QML 层级设计:从入门到精通
3872 1
|
算法 Linux API
【Qt 延迟手段】Qt中实现延迟和休眠的多种方法
【Qt 延迟手段】Qt中实现延迟和休眠的多种方法
2965 0
【Qt 学习笔记】使用QtCreator创建及运行项目 | 项目初始代码解释
【Qt 学习笔记】使用QtCreator创建及运行项目 | 项目初始代码解释
2579 2
|
IDE 编译器 Linux
linux 编译 c或cpp 文件为动态库 so 文件(最简单直观的模板)
linux 编译 c或cpp 文件为动态库 so 文件(最简单直观的模板)
|
6月前
|
存储 索引 Python
python 集合的所有基础知识
python 集合的所有基础知识
578 0
|
C++
QML语法之property属性
QML语法之property属性
701 3
|
安全 开发者 流计算
python中的deque详解
`deque`是Python中功能强大且灵活的双端队列,提供了高效的双端操作,适用于多种实际应用场景。通过详细了解 `deque`的基本特性和常见操作,开发者可以更好地利用这一数据结构来提高代码的性能和可读性。希望本文对你在Python编程中使用 `deque`有所帮助。
854 0
qml import 自定义模块 cmake
qml import 自定义模块 cmake
987 1