如何为Qt QML项提供一个在更改时不通知的属性?



我(非常)偶尔发现自己需要为一个在其他表达式中不可绑定的项添加一个属性,也就是说,当它的值发生变化时,它不会通知任何使用其值的对象,因此不会导致表达式重新求值。这样做的目的是要有一个纯粹的状态变量,它不能让自己卷入绑定循环。

作为一个具体的例子:

Item
{
property string state: ""
visible:
{
if(some_condition)
{
state = "foo";
return true;
}
if(state === some_other_external_state)
return true;
state = "";
return false;
}
}

在这种情况下,当some_condition为真时,visible属性设置state,并且由于visible依赖于state的值,因此发生绑定循环。如果state属性没有绑定,并且如其名称所示,纯粹是一个状态变量,则避免此循环。

我以前用过的一个简单的解决方案是:

Item
{
property var state: [""]
visible:
{
if(some_condition)
{
state[0] = "foo";
return true;
}
if(state[0] === some_other_external_state)
return true;
state[0] = "";
return false;
}
}

这是有效的,因为当数组的内容发生变化时,数组属性不会通知,它们只在数组本身发生变化时通知。它不漂亮,但它有效。

不能在QML中创建非绑定属性。但是你可以控制创建什么绑定。

根据设计,属性绑定不应该改变其他属性的值。这就是您提供的代码示例中的问题来源。没有足够的细节来提供完整的解决方案,但考虑以下伪代码:
Item {
// Item has state property already - you should not redefine it
// property string state: ""
visible: state !== "" // or whatever else is correct, but keep it simple
// Optionally:
onVisibleChanged: {
// Any extra operations that should be done
// when item is being shown or hidden
// But you should not change state variable here!
}

// Monitor all events that should change state and keep it up to date
// Usually Qt will already have a signal notifying about particular change 
// or you can define signals you need and emit in proper places 
Connections {
target: other_object
onSignalForSomeSpecificEvent: state = "bar"
}   
// Some conditions you can define in declarative form
// Suitable for condition depending on other properties
property bool someCondition 
onSomeConditionChaged: state = 'foo'
}

很大程度上取决于特定的设计,但有两条经验法则:

  • 绑定不应该改变其他属性
  • 使用信号处理程序来避免不必要的绑定

相关内容

  • 没有找到相关文章

最新更新