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

Posted

技术标签:

【中文标题】如何从 C++ 中删除属性上的 QML 绑定?【英文标题】:How to remove QML binding on property from C++? 【发布时间】:2018-03-29 15:34:35 【问题描述】:

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

就像在这个例子中一样,CppItemimplicitWidth 是父级宽度的一半,Text 将填充布局。如果调整窗口大小,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++ 中删除此绑定?

【问题讨论】:

How can I remove this binding from C++ ? 如果您的应用程序设计正确,则不必这样做。从 C++ 接触任何 QML 都被认为是不好的做法,而且像属性绑定这样的东西甚至不在公共 C++ API 中,所以情况更糟。 @dtech 我同意更好的设计可以避免这种情况,但您并不总是选择设计。无论如何,这种行为并不直观,所以我认为指出这一点很好! 【参考方案1】:

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

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

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

【讨论】:

以上是关于如何从 C++ 中删除属性上的 QML 绑定?的主要内容,如果未能解决你的问题,请参考以下文章

从高度动态的 C++ 数据模型更新 QML:计时器与属性绑定

如何有条件地禁用 QML 绑定到 C++ 后端?

QML ListView:检测到属性“高度”的绑定循环

如何从 C++ 中检索 QML 属性的值?

如何从 QT 项目中正确删除 QML 文件

如何分析“绑定循环”