如何从 C++ 中删除 属性 上的 QML 绑定?
How to remove QML binding on property from C++?
使用 QML,属性 值可以基于另一个对象 属性 的值,它被称为 binding 并且它会在每次 属性 时更新您的值你所依赖的已更新。
如本例所示,CppItem
的 implicitWidth
是父级宽度的一半,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);
使用 QML,属性 值可以基于另一个对象 属性 的值,它被称为 binding 并且它会在每次 属性 时更新您的值你所依赖的已更新。
如本例所示,CppItem
的 implicitWidth
是父级宽度的一半,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);