【问题标题】:Binding loop problem in an application with QML&C++使用 QML&C++ 的应用程序中的绑定循环问题
【发布时间】:2019-09-20 03:22:18
【问题描述】:

我正在做一个项目,基本上我想做的是在 2 个 QML 文件中的 2 个盒子之间同步一个属性 theProperty(2 个盒子都拥有该属性),我将 theProperty 绑定到 C++ Q_PROPERTY,所以通过将 2 个框绑定到相同的 C++ Q_PROPERTY,可以实现同步。 这是我在 Box A 和 B 中的代码。theProperty 可以由 Box A 和 B 独立更改

Box_A {
    id: box_A
    // sth
    Binding { target:box_A; property: "theProperty"; value:model.CppModel.theProperty } 
    onThePropertyChanged: {
        model.CppModel.theProperty = theProperty
    }
}
Box_B {
    id: box_B
    // sth
    Binding { target:box_B; property: "theProperty"; value:model.CppModel.theProperty } 
    onThePropertyChanged: {
        model.CppModel.theProperty = theProperty
    }
}

在 cpp 中:

    Class Item: QObject{
        Q_OBJECT
        Q_PROPERTY(bool theProperty READ theProperty WRITE theProperty NOTIFY theProperty Changed)
  //sth
        }

在 Box_A 和 B 内,有一个鼠标区域可以更改 theProperty

MouseArea{

  onClicked: theProperty=!theProperty
}

问题是,一旦我在框 A 或 B 中更改 theProperty,qt 创建者抱怨循环绑定检测到值:model.CppModel.theProperty 在另一边,有没有办法解决这个问题?

【问题讨论】:

标签: c++ qt qml


【解决方案1】:

你为什么不这样做:

Box_A {
    id: box_A
    // sth
    theProperty:model.CppModel.theProperty  
}

那不适合你吗?

【讨论】:

  • 我尝试了另一个类似的属性,奇怪的是它起初工作但后来失败了,例如如果我从 box_A 开始并不断更改 Box_A 中的属性,则 Box_B 中的属性可能会相应更改,但是如果我开始在 Box_B 中更改该属性,则 2 个框之间的“同步”会丢失。更让我困惑的是,我对“另一个类似的属性”使用了完全相同的上述方法,它对我来说效果很好,但是我上面展示的属性不适用于该方法
  • @WSL 对此的快速破解是在该属性更改时从BOX_ABOX_B 发出信号,与onThePropertyChanged 不同,例如signal propChanged(var prop) 并执行onPropChanged: model.CppModel.theProperty = prop 这个将避免绑定循环,因为它不是被调用的属性的默认 onChanged 信号
猜你喜欢
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多