代码之家  ›  专栏  ›  技术社区  ›  ymoreau

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

  •  1
  • ymoreau  · 技术社区  · 7 年前

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

    如本例所示 implicitWidth 属于 CppItem 是父对象宽度的一半 Text 将填充布局。如果调整窗口大小,则 CPP项目 宽度已更新。

    Window
    {
        RowLayout {
            anchors.fill: parent
    
            CppItem {  implicitWidth: parent.width * 0.5  }
            Text    {  Layout.fillWidth: true  }
        }
    }
    

    在我的问题中,CppItem是 QQuickItem 使用一些C++代码,在某些特定情况下,C++代码将设置 隐式宽度 使用以下代码。
    我知道我可以 setImplicitWidth 但我不确定这是否会对我的问题产生影响,而且如果该属性不是在C++中声明的,而是在加载的QML文件中声明的,那么无论如何都无法做到这一点。

    setProperty("implicitWidth", 100);
    

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

    cppItem.implicitWidth = 100
    

    对于C++代码,在 parent.width 将在上触发更新 cppItem.implicitWidth 然后再次设置值 CPP项目。隐式宽度

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   ymoreau    7 年前

    使用 QObject::setProperty 在C++中,不会破坏以前在QML中创建的绑定。

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

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