【问题标题】:QML two-way C++ binding doesn't receive changes anymoreQML 双向 C++ 绑定不再接收更改
【发布时间】:2012-08-10 20:35:56
【问题描述】:

我面临一个大问题,即需要很长时间才能修复,因为我不知道原因以及如何修复它。问题很简单:我有一个示例 QML 组件定义为:

Rectangle {
    id: rect
    property bool test: myclass.testproperty

    Rectangle {
        width: 50
        height: 50
        visible: parent.test
    }
}

我连接了一个 MouseArea onClicked 信号来执行此操作:

test = !test

所以我切换布尔变量的值。为了使用 READ、WRITE 和 NOTIFY 信号将值从 C++ 推送到 QML 以及从 QML 推送到 C++ Q_PROPERTY,我使用了这个

Binding {
    target: myclass
    property: "testproperty"
    value: rect.test
}

在我单击 mouseArea 之前一切正常,因此我通过绑定推送更改。之后,每次我尝试从 C++ 设置一个新的属性值时,我都看不到 QML 有任何变化,就像绑定被破坏一样。但是,如果我尝试单击 MouseArea,我仍然会调用 C++ 类的 setTestProperty 方法。基本上,它与 C++ -> QML 方式不同步。为什么?我找不到问题,发出信号是因为 QSignalSpy 给我 1 作为使用后发出的次数

emit this->testPropertyChanged(newvalue)

编辑

这里是一个例子:基本上这里我们使用具有相同确切信号的 QString 属性。唯一改变的是,我没有使用 Rectangle QML 元素并绑定到自己的属性,而是使用 TextInput 元素

TextInput {
    id: mytext
    text: myclass.testproperty
}

Binding {
    target: myclass
    property: "testproperty"
    value: mytext.text
}

【问题讨论】:

    标签: c++ qt4 qml qt-quick


    【解决方案1】:

    这里没有问题。这是一个标准的 QML 绑定行为。当您在 JavaScript 代码中更改某些 QML Widget 的属性时,对它的所有声明性绑定都将终止。您可以选择在事件处理程序的 JS 代码中使用声明式绑定或手动更新值。

    编辑

    Rectangle {
        id: rect
    
        // Establishing initial value for 'test' property via QML binding
        property bool test: myclass.testproperty
    
        // Manual update of 'test' property when binding will be broken
        Connections {
            target: myclass
            onTestpropertyChanged: {
                rect.test = xxx
            }
        }
    }
    

    【讨论】:

    • 如果我使用相同的东西,但使用 Text 组件和相关的文本属性,它就可以工作。为什么?
    • 我不知道,为什么双向绑定适用于 Text 对象。你能举个例子吗?
    • 添加了一个非常小的例子
    • 这里没有问题,因为各路只有明确的绑定,没有任何JS代码。我想,如果您要更改 MouseArea 单击处理程序中的文本属性,那么 C++ -> QML 绑定将被破坏。
    • 你是对的,如果我通过 MouseArea 更改文本,它也不起作用。有没有办法让它工作?我正在使用 QML 构建一个复选框组件,因此我需要使用 MouseArea 来处理勾选/取消勾选之间的开关,并且我需要将值推送到 C++ 中的 Q_PROPERTY 并最终从 C++ 接收一个新值
    猜你喜欢
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多