如何从 C++ 中删除属性上的 QML 绑定?
Posted
技术标签:
【中文标题】如何从 C++ 中删除属性上的 QML 绑定?【英文标题】:How to remove QML binding on property from C++? 【发布时间】:2018-03-29 15:34:35 【问题描述】:使用 QML,属性值可以基于另一个对象属性的值,称为 binding,它会在每次更新您所依赖的属性时更新您的值。
就像在这个例子中一样,CppItem
的 implicitWidth
是父级宽度的一半,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 绑定?的主要内容,如果未能解决你的问题,请参考以下文章