【问题标题】:Is it legal to assign to property that already has binding defined in QML分配给已经在 QML 中定义的绑定的属性是否合法
【发布时间】:2021-01-21 17:20:56
【问题描述】:

假设属性“x”在 QML 中有一个即时值, 另一个属性 'y' 绑定到 'x'

Text { id: mytext;  x: 100;  y: x;  text: x+","+y; }

为任何属性分配另一个值是否合法? 即绑定'y:x'只是被删除/覆盖,还是进入某种不受支持/错误的状态?

Button { onClicked: { mytext.x = 120; mytext.y = 130; } }

如果我在同一个 QML 文件中明确指定另一个绑定会怎样:

Binding { target: mytext; property: "x"; value: 140; }
Binding on y { value: 150; } //insert this line into mytext

如果指定了“when”,有什么不同吗?我可以指定多个条件绑定吗?

Binding { target: mytext; property: "x"; value: 160; when: width < 600; }
Binding { target: mytext; property: "x"; value: 170; when: width > 800; }

动画或行为有什么不同吗?

NumberAnimation on x { from: 100; to: 200; duration: 500 } //insert line into mytext
NumberAnimation { target: mytext; property: "y"; from: 100; to: 200; duration: 500 }

从 C++ 代码分配(或创建绑定)有什么不同吗?

mytextPointer->setX(190);

请注意,我不是在询问此代码是否在您的系统上工作 - 相反,我想知道此代码是否应该工作 strong> 符合预期。

我的意图是:

  • “直接指定”值(x=100 和 y=x)是默认值,
  • 无论何时分配它们,它们的值都会被分配的值替换

我目前对文档的理解是:

  • 有多个条件绑定是可以的(只要两个条件不能同时为真?) - 在条件不再为真后,绑定恢复以前的值(不一定是默认值);
  • animation/behavior/transition 在运行/活动时会覆盖绑定,但在完成后不会恢复之前的值(?);
  • 其他一切都不清楚(但显然有效;如果分配了多个绑定,那么显然第一个提供了值)

【问题讨论】:

    标签: qt qml qtquick2 qt-quick qtdeclarative


    【解决方案1】:

    一个问题包含了很多问题。我将专注于您陈述的意图:

    • “直接指定”值(x=100 和 y=x)是默认值,

    • 无论何时分配它们,它们的值都会被分配的值替换

    如果你有一个绑定,像这样:

    Text { id: mytext;  x: 100;  y: x;  text: x+","+y; }
    

    您稍后更改x 的值,它应该在引擎盖下发出xChanged 信号。绑定意味着y 将监听该信号并相应更新。

    现在如果你以后更改y,像这样:

    Button { onClicked: { mytext.y = 130; } }
    

    绑定已损坏。 y 将不再监听来自 x 的更改。

    对于动画,如果您告诉y 以与x 不同的值进行动画处理,那么绑定就会被破坏。不过,中间动画步骤不会破坏绑定。你可以让y 仍然绑定到x,但是随着x 的变化,y 可以为这些变化设置动画并保持绑定。

    【讨论】:

    • 感谢您的精彩回答。我假设“损坏”意味着“完全删除”,所以我的问题的答案是:编写这样的代码是合法的 - QML 不应该崩溃,表现出未定义的行为,打印错误记录等仅仅因为绑定以这种方式被破坏(这是我所期望的)。我还假设这意味着某些代码(例如在条件绑定元素中)可能会选择以某种方式“保留”并稍后“恢复”绑定(不管如何)-但如果没有,则绑定完全消失了并且坏了就忘记了。对吗?
    • 1. Broken 表示断开连接。 y 不再连接到 onXChanged 信号。 2. 是的,编写这样的代码是合法且普遍的。 3. Binding 对象能够恢复断开连接的绑定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多