在 QML 中(至少在 5.6 1版本之前),一旦在 JavaScript 上下文中分配了新值,属性绑定就会被破坏:
Item {
property bool sourceBool: <some changing value e.g. from C++ code>
property bool boundBool: sourceBool
function reassignBool() {
boundBool = true;
}
}
一旦reassignBool
被调用,boundBool
将true
不管 的状态sourceBool
。
我希望能够为不会破坏原始绑定的属性分配一个临时值;临时值将持续存在,直到NOTIFY
触发与原始绑定相关联的任何信号,此时绑定属性将再次反映绑定计算的值。
作为一个示例用例,假设我有一个按钮,我不希望用户能够连续按两次,并且根据某些规则启用或禁用该按钮:
MyButton {
id: onceOnlyButton
// Suppose the QML type `MyButton` provides a boolean property
// called `enabled` that greys out the button and prevents it from
// being clicked when `false`.
enabled: <condition1> && <scondition2>
onClicked: {
<schedule some asynchronous work>
}
}
假设当按钮被点击时,最终会<condition1>
变成,所以按钮最终会被适当地禁用——但不是立即。false
所以我想做如下的事情:
....
onClicked: {
enabled = false
<schedule some asynchronous work>
enabled = Qt.binding(function() {
return <condition1> && <condition2>
}
}
...但当然,一旦我重新建立绑定,既然condition1
还没有成为,false
就会enabled
再次成为true
。
我想我可以创建某种Connections
对象,将NOTIFY
与之关联的信号连接<condition1>
到将调用的处理程序Qt.binding
,然后....删除该Connections
对象,我想。但这似乎相当复杂和不雅。
有什么方法可以确保将enabled
其设置为false
immediate ,然后在发出任何这些信号后立即重新绑定到NOTIFY
信号?<condition1>
<condition2>
1我不完全确定赋值如何影响 5.7 中的绑定,但我知道为属性赋值不会自动破坏绑定。所以这可能会在 5.7 中自动开箱即用。