• 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"; })
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    • var 属性 的变更

    需要注意的是,分配给 var 属性的 JavaScript 对象的常规属性的更改不会触发访问它们的绑定的更新。

    示例

    Item {
        property var car: new Object({wheels: 8})
    
        Text {
            text: "The car has " + car.wheels + " wheels";
        }
    
        Component.onCompleted: {
            car.wheels = 12;
        } 
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    示例中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
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    类似地,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'
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    • 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>

  • 相关阅读:
    java-net-php-python-ssm二手商品交易平台的设计与实现(2)计算机毕业设计程序
    01 `Linux`基础
    MediaCodec同步异步使用
    2023 ICPC 网络赛 第一场 部分题解 (待完善)
    Windows下使用VS2010编译出带pdb可调试的FFmpeg库
    HashMap 哈希碰撞、负载因子、插入方式、扩容倍数
    线程同步
    LeetCode26——删除有序数组中的重复项
    2022年11月华南师范大学自考本科-《计算机信息管理课程实验—C++程序设计》实践题目
    XAML标记扩展(3)
  • 原文地址:https://blog.csdn.net/qq_21438461/article/details/125554802