【问题标题】:How to change a property binding during an element creation in QML?如何在 QML 中创建元素期间更改属性绑定?
【发布时间】:2023-01-30 10:07:11
【问题描述】:

假设我有一个自定义的CheckBox

//MyCheckBox.qml

CheckBox {
  required property QtObject proxy

  checked: proxy.value

  Binding {
    target:    proxy
    property:  "value"
    value:     checked
  }
}

所以 MyCheckBox 的检查状态绑定到我对象的 value 属性 (proxy)反之亦然,即我有双向绑定。

我正在使用我的自定义复选框,如下所示:

//My window
Item {

  ...

  MyCheckBox {
    id:    ordinaryCheck
    proxy: ...
  }

  ...
}

一切都按预期工作。但是,如果我需要反转 MyCheckBox 的某些实例的逻辑怎么办:proxy.value 为真时,复选框未选中,当proxy.value 为假时,复选框被选中?但是,ofc 不起作用,因为如果我尝试这样做,这里有一个绑定循环:

Item {

...

  MyCheckBox {
    id:    invertedCheck

    proxy:     ...
    checked:   !proxy.value

    Binding {
      target:    proxy.value
      property:  "value"
      value:     !checked
    }
}

Qt 绑定也不是一个选项:

//MyCheckBox.qml

CheckBox {
  required property QtObject proxy

  checked: proxy.value

  Component.onCompleted {
    property.value = Qt.binding(function() { return checked });
  }
}

我有同样的绑定循环错误在这种情况下。

那么我要达到目标的选择是什么,如何在实例化时交替绑定?

【问题讨论】:

标签: c++ qt user-interface qml


【解决方案1】:

如果您担心潜在的绑定循环,则可以将其重写为命令式实现,例如

CheckBox {
    required property QtObject proxy

    onCheckedChanged: {
        if (proxy && proxy.value !== checked) {
            proxy.value = checked;
        }
    }

    property bool proxyValue: proxy && proxy.value ? true : false

    onProxyValueChanged: {
        if (checked !== proxyValue) {
            checked = proxyValue;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    相关资源
    最近更新 更多