1

使用 QML,属性值可以基于另一个对象属性的值,它称为绑定,每次更新您所依赖的属性时,它都会更新您的值。

就像在这个例子中一样,implicitWidthofCppItem是父级宽度的一半,并且Text将填充布局。如果调整窗口大小,CppItem宽度会更新。

Window
{
    RowLayout {
        anchors.fill: parent

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

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

setProperty("implicitWidth", 100);

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

cppItem.implicitWidth = 100

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

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

4

1 回答 1

1

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

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

// setProperty("implicitWidth", 100); --> Does not break binding
QQmlProperty::write(this, "implicitWidth", 100);
于 2018-03-30T08:56:18.190 回答