QML 中的属性绑定

QML中的属性绑定可通过冒号、Qt.binding()方法和Binding类型实现。冒号绑定适用于对象初始化,Qt.binding()用于运行时,Binding类型支持不可访问属性和条件绑定。详细介绍了这三种方法的使用和特点。

QML 中的属性绑定

有两种方法可以给 QML 对象的属性进行赋值:静态值和绑定值。

例如 height: 100,这是一个静态值。然而 height: width * 2,这就是一个绑定值。绑定值表示属性的值跟将随绑定表达式计算出来的值。这里表示的是高永远是宽的两倍。

运用绑定表达式给对象赋值也就是常说的属性绑定(Property Binding),它是 QML 中的一个核心特性。

一、使用冒号

以冒号表示的属性绑定是最常见的属性绑定方法。冒号后面的可以是任意 JS 表达式或者语句、QML 对象属性、函数调用以及 JS 中的内置对象,比如 Date、Math 等。

// 动态绑定示例
height: parent.height / 2

height: Math.min(parent.width, parent.height)

height: parent.height > 100 ? parent.height : parent.height / 2

height: {
    if (parent.height > 100)
        return parent.height
    else
        return parent.height / 2
}

height: someMethodThatReturnsHeight()

以上的属性绑定方式,如果在 JS 语句中再次指定了一个静态值,绑定将从此失效。

Rectangle {
    width: 100
    height: width * 2

    focus: true
    Keys.onSpacePressed: {
        height = width * 3 // 按下空格键后,height 的值将不再随 width 的变化而变化
    }
}

但可以重新绑定,方法是使用 Qt.binding(function)

二、Qt.binding(function) 方法

Rectangle {
    width: 100
    height: width * 2

    focus: true
    Keys.onSpacePressed: {
        height = Qt.binding(function() { return width * 3 }) // 重新绑定
    }
}

在 JS 函数中进行属性绑定时,还可以使用 this 关键字,它代表接收这个绑定的对象。

Item {
    width: 500
    height: 500
    Rectangle {
        id: rect
        width: 100
        color: "yellow"
    }
    Component.onCompleted: {
        rect.height = Qt.binding(function() { return this.width * 2 }) // this 代表的是 rect
        console.log("rect.height = " + rect.height) // prints 200, not 1000
    }
}

另外一种属性绑定的绑定方法是:运用 QML 中的 Binding 类型。

三、Binding 类型

Binding 主要提供两种能力:

  1. 绑定到不可访问的属性

    // app 是 C++ 中导出的属性,在 QML 中不可直接进行属性绑定,但可用 Binding 进行绑定
    TextEdit { id: myTextField; text: "Please type here..." }
    Binding { target: app; property: "enteredText"; value: myTextField.text }
    
  2. 条件绑定

    Binding 可以通过 delay 设置延时绑定:不会立即更新被绑定的对象,要等到事件队列空闲的时候再去响应。

    Binding 可以通过 when 指定何种条件下才去响应。

总结

QML 中的属性绑定有三种方法:

  1. QML 对象初始化时用冒号绑定

    能在对象初始化时绑定,不能在运行时绑定

  2. 运行时在 JS 函数中用 Qt.binding() 方法绑定

    不能在初始化时绑定,能在运行时绑定

  3. Binding 类型进行绑定

    能给不可访问的属性进行绑定,可以设置条件绑定

参考

https://doc.qt.io/qt-5/qtqml-syntax-objectattributes.html

https://doc.qt.io/qt-5/qtqml-syntax-propertybinding.html

https://doc.qt.io/qt-5/qml-qtqml-binding.html

https://zhuanlan.zhihu.com/p/56401271

在Qt Quick (QML)中,您可以使用自定义属性(custom properties)来绑定模型(model)。下面是一个简单的示例,说明如何实现这一过程: 首先,您需要创建一个模型。这个模型可以是任何您需要的类型,例如一个数组、一个对象列表或者是一个自定义的类。 例如,我们创建一个简单的模型,其中包含一些字符串: ```qml Item { id: modelItem property var myModel: ["item1", "item2", "item3"] } ``` 然后,您可以创建一个自定义属性,该属性将引用模型: ```qml Item { id: rootObject property var myModel: modelItem.myModel // 这里引用了 modelItem 的 myModel 属性 } ``` 在这个例子中,我们使用了`property var`来声明一个自定义属性`myModel`,它引用`modelItem`的`myModel`属性。这意味着,当您更改`myModel`属性时,它将反映在模型`modelItem`的`myModel`上。同样,当您在应用程序中更改模型时,它也会反映在自定义属性上。 注意:如果您想将自定义属性绑定到更复杂的模型结构(例如对象列表),那么您可能需要使用一种更复杂的数据绑定机制,例如使用`ListModel`或`DelegateView`等组件。这些组件提供了更高级的数据绑定功能,允许您将数据模型和视图(如网格、列表等)进行更精细的绑定。 最后,请注意,自定义属性的使用需要谨慎。过度使用自定义属性可能会导致代码难以理解和维护。因此,在设计和实现应用程序时,请确保您了解自定义属性的用途和限制,并考虑使用其他数据绑定机制或策略来处理更复杂的数据绑定需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值