如何从 C++ 中删除 属性 上的 QML 绑定?

How to remove QML binding on property from C++?

使用 QML,属性 值可以基于另一个对象 属性 的值,它被称为 binding 并且它会在每次 属性 时更新您的值你所依赖的已更新。

如本例所示,CppItemimplicitWidth 是父级宽度的一半,Text 将填充布局。如果您调整 window 的大小,CppItem 宽度会更新。

Window
{
    RowLayout {
        anchors.fill: parent

        CppItem {  implicitWidth: parent.width * 0.5  }
        Text    {  Layout.fillWidth: true  }
    }
}

在我的问题中,CppItem 是带有一些 C++ 代码的 QQuickItem,在某些特定情况下,C++ 代码将使用以下代码设置 implicitWidth
我知道我可以使用 setImplicitWidth 但我不确定它是否会对我的问题产生影响,而且无论如何如果 属性 没有在 C++ 中声明但在加载的 QML 文件。

setProperty("implicitWidth", 100);

已设置 属性 值,但未删除 QML 绑定。所以上面的C++代码不等同于QML代码:

cppItem.implicitWidth = 100

使用 C++ 代码,parent.width 上的任何更改都将触发 cppItem.implicitWidth 上的更新并再次设置值 cppItem.implicitWidth

如何从 C++ 中删除此绑定?

在 C++ 中使用 QObject::setProperty 不会破坏之前在 QML 中进行的绑定。

但是使用 QQmlProperty::write 确实会破坏绑定。

// setProperty("implicitWidth", 100); --> Does not break binding
QQmlProperty::write(this, "implicitWidth", 100);