Как удалить привязку QML к свойству из C++?
В QML значение свойства может быть основано на значении другого свойства объекта, оно называется связыванием и будет обновлять ваше значение каждый раз, когда обновляется свойство, от которого вы зависите.
Как и в этом примере, implicitWidth
из CppItem
это половина ширины родителя и Text
заполнит макет. Если вы измените размер окна, CppItem
ширина обновляется.
Window
{
RowLayout {
anchors.fill: parent
CppItem { implicitWidth: parent.width * 0.5 }
Text { Layout.fillWidth: true }
}
}
В моей проблеме CppItem является QQuickItem
с некоторым кодом C++, а в некоторых конкретных случаях код C++ будет устанавливать implicitWidth
со следующим кодом.
Я знаю, что мог бы использовать setImplicitWidth
но я не уверен, что это будет иметь значение для моей проблемы, и в любом случае вы не сможете сделать это, если свойство объявлено не в C++, а в загруженном файле QML.
setProperty("implicitWidth", 100);
Значение свойства установлено, но привязка QML не удаляется. Таким образом, приведенный выше код C++ не эквивалентен коду QML:
cppItem.implicitWidth = 100
С кодом C++ любое изменение parent.width
вызовет обновление cppItem.implicitWidth
и снова установите значение cppItem.implicitWidth
,
Как я могу удалить эту привязку из C++?
1 ответ
С помощью QObject::setProperty
в C++ не нарушается привязка, ранее сделанная в QML.
Но используя QQmlProperty::write
нарушает привязку.
// setProperty("implicitWidth", 100); --> Does not break binding
QQmlProperty::write(this, "implicitWidth", 100);