Связываемые свойства Qt
Qt предоставляет связываемые свойства. Связываемые свойства — это свойства, которые либо имеют значение, либо определяются с помощью любой функции C++, обычно лямбда-выражения C++. В случае, если они определены с помощью функции C++, они обновляются автоматически всякий раз, когда изменяются их зависимости.
Связываемые свойства реализованы в классе QProperty, который содержит объект данных и указатель на структуру данных управления, и в классе QObjectBindableProperty, который содержит только объект данных и использует оборачивающий QObject для хранения указателя на структуру данных управления.
Вводный пример
Выражение привязки вычисляет значение, считывая другие значения QProperty. За кулисами эта зависимость отслеживается. Всякий раз, когда обнаруживается изменение в зависимости любого свойства, выражение привязки переоценивается, и новый результат применяется к свойству. Это происходит лениво, отмечая привязку как «грязную» и оценивая ее только тогда, когда запрашивается значение свойства. Например:
QProperty<QString> firstname("John");
QProperty<QString> lastname("Smith");
QProperty<int> age(41);
QProperty<QString> fullname;
fullname.setBinding([&]() { return firstname.value() + " " + lastname.value() + " age: " + QString::number(age.value()); });
qDebug() << fullname.value(); // Prints "John Smith age: 41"
firstname = "Emma"; // Marks binding expression as dirty
qDebug() << fullname.value(); // Re-evaluates the binding expression and prints "Emma Smith age: 41"
// Birthday is coming up
age.setValue(age.value() + 1);
qDebug() << fullname.value(); // Re-evaluates the binding expression and prints "Emma Smith age: 42" Когда новое значение присваивается свойству firstname, выражение привязки для fullname отмечается как «грязное». Таким образом, когда последняя qDebug() строка пытается прочитать значение имени свойства fullname, выражение снова оценивается, firstname() будет снова вызвано и вернет новое значение.
Поскольку привязки являются функциями C++, они могут выполнять любые действия, возможные в C++. Это включает вызов других функций. Если эти функции обращаются к значениям, хранящимся в QProperty, они автоматически становятся зависимостями привязки.
Выражения привязки могут использовать свойства любого типа, поэтому в приведенном выше примере возраст — это целое число и включен в строковое значение с помощью преобразования в целое число, но зависимость полностью отслеживается.
Отслеживание связываемых свойств
Иногда отношения между свойствами нельзя выразить с помощью привязок. Вместо этого может потребоваться выполнить пользовательский код всякий раз, когда изменяется значение свойства, и вместо присвоения значения другому свойству передать его в другие части приложения. Например, для записи данных в сокет сети или вывода отладочной информации. QProperty предоставляет два механизма для отслеживания.
Вы можете зарегистрировать обратную функцию, которая будет вызываться всякий раз, когда значение свойства изменяется, используя onValueChanged(). Если вы хотите, чтобы обратная функция вызывалась также для текущего значения свойства, зарегистрируйте свою обратную функцию с помощью subscribe() вместо этого.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/bindableproperties.html