qt 之 qml 类型 Binding


Binding 使用场景

有时候,我们需要绑定一个不是QML直接实例化的组件的属性。一般是一个C++扩展的属性。或者这样的场景下,条件判断比如

value: if (mouse.pressed) mouse.mouseX

在这种情况下,一般的绑定不工作,而 Binding类型则允许我们绑定任何值到任何属性上。


一、Binding

属性类型解释
propertystring被更新的属性
targetObject被更新的目标
delayedbool延迟绑定不会立即更新目标,而是等到事件队列已被清除。这可以作为一个优化,或防止中介值被分配
valueany要在目标对象和属性上设置的值,它能是一个常数(不常用),或者绑定的表达式
whenbool绑定是否被激活,它应该被设置成表达式,用以判断我们是否想激活绑定
restoreModeenumeration当绑定条件不符合时,描述当且时应该如何恢复原始值

restoreMode:
Binding.RestoreNone The original value is not restored at all
Binding.RestoreBinding The original value is restored if it was another binding. In that case the old binding is in effect again.
Binding.RestoreValue The original value is restored if it was a plain value rather than a binding.
Binding.RestoreBindingOrValue The original value is always restored.

二、使用步骤

1.绑定到无法访问的属性:

有时候,我们需要绑定一个不是QML直接实例化的组件的属性。一般是一个C++扩展的属性。在这种情况下,一般的绑定不工作,Binding允许我们绑定任何值到任何属性上。

例如,一个C++应用程序影射了一个叫app.enteredText的属性到QML,我们可以用Binding属性来更新app.enteredText,就像下面的例子这样:

TextEdit { 
	id: myTextField; 
	text: "Please typehere..." 
	}
	
Binding { 
	target: app; 
	property: "enteredText";
	value: myTextField.text 
	}

当TextEdit被更新,则C++属性也将更新。

2.绑定Item property:

Item
 {
      id: item
      property rect rectangle: Qt.rect(0, 0, 200, 200)
  }

  Binding {
      target: item
      property: "rectangle.x"
      value: 100
  }
Binding {
    target:contactName; 
    property: 'text'
    value: name;
    when: list.ListView.isCurrentItem
}

3.根据条件绑定到单分支。

有时候,我们希望当某些条件为真时,属性的值能被控制。而所有其他情况下,我们放弃对属性的控制。这时候,直接完成绑定是不可能的,因为这需要为所有可能的分支提供值。

例如:

// produces warning: "Unable to assign [undefined]to double value"
value: if (mouse.pressed) mouse.mouseX

在上面的例子中,无论什么时候释放鼠标,警告都会发生。因为当鼠标没有被按下时,value没有定义。注意,上面的属性加冒号,就是通常的绑定方法。

与之区别的,是我们使用Binding来处理这种预期,以避免警告。例如下面的代码:

Binding on value {
    when:mouse.pressed
    value:mouse.mouseX
}

Binding组件也能恢复预先直接绑定在属性上的值,从这个角度来说,这个组件就像是一个简化版的State。

下面的代码等效于上面的Binding:

State {
    name:"pressed"
    when:mouse.pressed
    
   PropertyChanges {
       target: obj
       value: mouse.mouseX
    }
}

如果绑定的目标或属性更改,绑定值会立刻被推送到新目标上

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QML中,`Binding`元素用于将一个属性绑定到另一个属性,以实现二者之间的关联。`Binding`元素具有以下属性: 1. `target`:指定要绑定的目标属性所属的对象。可以是任何QML对象,如控件、图形元素等。 2. `property`:指定要绑定的目标属性的名称。可以是目标对象上的任何可绑定属性。 3. `value`:指定要绑定的目标属性的值。它可以是一个直接值,也可以是一个表达式。当绑定的源属性发生变化时,该值将被更新到目标属性上。 下面是一个示例,展示如何使用`Binding`元素将矩形的颜色与滑块的值进行绑定: ```qml import QtQuick 2.15 import QtQuick.Controls 2.15 ApplicationWindow { visible: true width: 400 height: 300 Rectangle { width: 200 height: 200 color: "blue" Slider { anchors.horizontalCenter: parent.horizontalCenter anchors.bottom: parent.bottom width: parent.width onValueChanged: { // 绑定矩形的颜色到滑块的值 rectangle.color = "#"+(value*255).toString(16)+"0000" } } } Binding { target: rectangle property: "color" value: "#"+(slider.value*255).toString(16)+"0000" } } ``` 在上述代码中,我们创建了一个矩形和一个滑块,通过`Binding`元素将矩形的颜色与滑块的值进行绑定。当滑块的值发生变化时,矩形的颜色会相应地更新。 请注意,`Binding`元素可以放置在任何地方,但通常会将其放置在需要进行属性绑定的对象的范围内。在上述示例中,我们将`Binding`元素放置在`ApplicationWindow`中,以便在整个窗口范围内进行属性绑定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值