Как удалить привязку 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);
Другие вопросы по тегам