【问题标题】:Qt QML property binding and property change signal execution orderQt QML属性绑定和属性改变信号执行顺序
【发布时间】:2021-05-13 04:39:44
【问题描述】:

我找不到有关 QML 属性绑定和属性更改信号的确切执行顺序的信息。

例如,我有一个类似的属性:

property int myProp: 1000

然后我绑定了另一个属性:

property int myProp2: myProp

我有属性更改信号处理程序:

onMyPropChanged: console.log("myProp changed: ", myProp, " myProp2: ", myProp2)
onMyProp2Changed: console.log("myProp2 changed: ", myProp2, " myProp: ", myProp)

如果我将 myProp 设置为 2,例如输出是:

qml: myProp changed:  2  myProp2:  1000
qml: myProp2 changed:  2  myProp:  2

我不知道是先运行属性更改信号然后再更新依赖属性的规则,还是根本没有定义它们的执行顺序。如果我有更多的依赖属性会发生什么,是否定义了它们的重新评估顺序?

那么最后像这样的交叉依赖呢:

property int myProp3: myProp2 + myProp
property int myProp2: myProp
property int myProp: 1000

onMyPropChanged: console.log("myProp changed: ", myProp, " myProp2: ", myProp2, " myProp3: ", myProp3)
onMyProp2Changed: console.log("myProp2 changed: ", myProp2, " myProp: ", myProp, " myProp3: ", myProp3)
onMyProp3Changed: console.log("myProp3 changed: ", myProp3, " myProp: ", myProp, " myProp2: ", myProp2)

在我的机器上输出是:

qml: myProp changed:  2  myProp2:  1000  myProp3:  2000
qml: myProp2 changed:  2  myProp:  2  myProp3:  2000
qml: myProp3 changed:  4  myProp:  2  myProp2:  2

【问题讨论】:

    标签: qt qml


    【解决方案1】:

    docs 说:

    如果多个槽连接到一个信号,则在发出信号时,这些槽将按照它们连接的顺序一个接一个地执行。

    但在 QML 中,您并没有真正按顺序定义事物,因此顺序实际上是未定义的。

    在您的第一个示例中,myProp2 绑定到 myProp,这意味着它连接到 myProp 的 onChanged 信号。如果任何其他属性也绑定到myProp,它们也将被连接。但按什么顺序?我们不知道。

    所以这个故事的寓意是你不应该依赖于 QML 中信号/槽的顺序。尝试以一种顺序无关紧要的方式编写代码。

    【讨论】:

    • 是的,对插槽有意义。但是属性改变的处理程序呢?它们是否也简单地连接到变化信号,因此它们没有任何区别?这是否意味着在执行属性更改信号处理程序时绑定可能已经更新? :O
    • onMyPropChanged 只是一个自动连接到myPropChanged 信号的插槽。所以它就像任何其他插槽一样被对待,因为它是一个插槽。我认为是的,有可能在此之前调用了其他插槽,因为无法指定它们连接的顺序。也许在实践中,您通常会看到一个在另一个之前调用,但我不建议依赖它。
    猜你喜欢
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多