Spec-Zone.ru › Qt

Класс QObjectBindableProperty

шаблон <typename Class, typename T, auto Offset, auto Signal> class QObjectBindableProperty

Класс QObjectBindableProperty — это шаблонный класс, который позволяет автоматически связывать свойства для данных свойств, хранящихся в классах, производных от QObject. Подробнее...

Заголовок: #include <QObjectBindableProperty>
CMake: find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
С момента: Qt 6.0
Наследуется от: QPropertyData
  • Список всех членов, включая унаследованные

Открытые функции

QObjectBindableProperty(Class *owner, QPropertyBinding<T> &&binding)
QObjectBindableProperty(Class *owner, const QPropertyBinding<T> &binding)
QObjectBindableProperty(Functor &&f)
QObjectBindableProperty(T &&initialValue)
QObjectBindableProperty(const T &initialValue)
QObjectBindableProperty()
~QObjectBindableProperty()
QPropertyNotifier addNotifier(Functor f)
QPropertyBinding<T> binding() const
bool hasBinding() const
void notify()
QPropertyChangeHandler<Functor> onValueChanged(Functor f)
QPropertyBinding<T> setBinding(const QPropertyBinding<T> &newBinding)
bool setBinding(const QUntypedPropertyBinding &newBinding)
QPropertyBinding<T> setBinding(Functor f)
void setValue(QObjectBindableProperty::parameter_type newValue)
void setValue(QObjectBindableProperty::rvalue_ref newValue)
QPropertyChangeHandler<Functor> subscribe(Functor f)
QPropertyBinding<T> takeBinding()
QObjectBindableProperty::parameter_type value() const

Макросы

Q_OBJECT_BINDABLE_PROPERTY(containingClass, type, name, signal)
Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(containingClass, type, name, initialvalue, signal)

Подробное описание

QObjectBindableProperty — это обобщённый контейнер, содержащий экземпляр T и в основном ведёт себя как QProperty. Он является одним из классов, реализующих свойства Qt Bindable Properties. В отличие от QProperty, он хранит свою структуру управления в окружающем QObject. Дополнительные шаблонные параметры используются для идентификации окружающего класса и члена функции этого класса, действующего как обработчик изменений.

Вы можете использовать QObjectBindableProperty для добавления поддержки привязки к коду, который использует Q_PROPERTY. Методы получения и установки должны быть тщательно адаптированы в соответствии с правилами, описанными в Получатели и установщики свойств Bindable Property.

Для вызова сигнала изменения при изменениях свойства используйте QObjectBindableProperty и передайте сигнал изменения в качестве обратного вызова.

Простой пример приведён ниже.

#include <QObject>
#include <QProperty>
#include <QDebug>

class Foo : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int myVal READ myVal WRITE setMyVal BINDABLE bindableMyVal)
public:
    int myVal() { return myValMember.value(); }
    void setMyVal(int newvalue) { myValMember = newvalue; }
    QBindable<int> bindableMyVal() { return &myValMember; }
signals:
    void myValChanged();

private:
    Q_OBJECT_BINDABLE_PROPERTY(Foo, int, myValMember, &Foo::myValChanged);
};

int main()
{
    bool debugout(true); // enable debug log
    Foo myfoo;
    QProperty<int> prop(42);
    QObject::connect(&myfoo, &Foo::myValChanged, [&]() {
        if (debugout)
            qDebug() << myfoo.myVal();
    });
    myfoo.bindableMyVal().setBinding([&]() { return prop.value(); }); // prints "42"

    prop = 5; // prints "5"
    debugout = false;
    prop = 6; // prints nothing
    debugout = true;
    prop = 7; // prints "7"
}

#include "main.moc"

QObjectBindableProperty обычно не используется напрямую, вместо этого его экземпляр создаётся с помощью макроса Q_OBJECT_BINDABLE_PROPERTY.

Используйте макрос Q_OBJECT_BINDABLE_PROPERTY в объявлении класса для объявления свойства как связуемого.

class MyClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int x READ x WRITE setX NOTIFY xChanged BINDABLE bindableX)
public:
    int x() const { return xProp; }
    void setX(int x) { xProp = x; }
    QBindable<int> bindableX() { return QBindable<int>(&xProp); }

signals:
    void xChanged();

private:
    // Declare the instance of the bindable property data.
    Q_OBJECT_BINDABLE_PROPERTY(MyClass, int, xProp, &MyClass::xChanged)
};

Если вам нужно инициализировать свойство непосредственно каким-либо значением, отличным от значения по умолчанию, вы можете использовать макрос Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS. Он принимает значение для инициализации в качестве одного из параметров.

class MyClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int x READ x WRITE setX NOTIFY xChanged BINDABLE bindableX)
public:
    int x() const { return xProp; }
    void setX(int x) { xProp = x; }
    QBindable<int> bindableX() { return QBindable<int>(&xProp); }

signals:
    void xChanged();

private:
    // Declare the instance of int bindable property data and
    // initialize it with the value 5.
    // This is similar to declaring
    // int xProp = 5;
    // without using the new QObjectBindableProperty class.
    Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(MyClass, int, xProp, 5, &MyClass::xChanged)
};

Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS не поддерживает несколько аргументов напрямую. Если ваше свойство требует нескольких аргументов для инициализации, пожалуйста, явно вызовите соответствующий конструктор.

class CustomType
{
public:
    CustomType(int val, int otherVal) : value(val), anotherValue(otherVal) { }

private:
    int value = 0;
    int anotherValue = 0;
};

// later when using CustomType as a property
Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(MyClass, CustomType xProp, CustomType(5, 10),
                                     &MyClass::xChanged)

Обработчик изменений может по желанию принимать один аргумент того же типа, что и свойство, в этом случае ему передаётся новое значение свойства. В противном случае он не должен принимать аргументы.

Если свойству не требуется уведомление об изменении, вы можете опустить «NOTIFY xChanged» в макросе Q_PROPERTY, а также последний аргумент макросов Q_OBJECT_BINDABLE_PROPERTY и Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS.

См. также Q_OBJECT_BINDABLE_PROPERTY, Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS, QProperty, QObjectComputedProperty, Систему свойств Qt и свойства Qt Bindable Properties.

Документация к функциям-членам

void QObjectBindableProperty::setValue(QObjectBindableProperty::parameter_type newValue)

void QObjectBindableProperty::setValue(QObjectBindableProperty::rvalue_ref newValue)

Присваивает newValue этому свойству и удаляет связанную с этим свойством привязку, если она существует. Если в результате значение свойства изменяется, вызывается функция обратного вызова для owner.

[default] QObjectBindableProperty::QObjectBindableProperty(Class *owner, QPropertyBinding<T> &&binding)

Конструирует свойство, связанное с предоставленным выражением binding. В первый раз при чтении значения свойства выражение binding вычисляется. Всякий раз, когда изменяется зависимость от привязки, привязка будет перевычисляться при следующем чтении значения этого свойства. При изменении значения свойства owner уведомляется посредством функции обратного вызова.

[default] QObjectBindableProperty::QObjectBindableProperty(Class *owner, const QPropertyBinding<T> &binding)

Конструирует свойство, связанное с предоставленным выражением binding. В первый раз при чтении значения свойства выражение binding вычисляется. Всякий раз, когда изменяется зависимость от привязки, привязка будет перевычисляться при следующем чтении значения этого свойства. При изменении значения свойства owner уведомляется посредством функции обратного вызова.

template <typename Functor> QObjectBindableProperty::QObjectBindableProperty(Functor &&f)

Создаёт свойство, привязанное к предоставленному выражению привязки f. При первом чтении значения свойства выражение привязки вычисляется. При изменении зависимости выражения привязки, оно перевычисляется при следующем чтении значения этого свойства.

QObjectBindableProperty::QObjectBindableProperty(T &&initialValue)

Перемещающее создание свойства с предоставленным значением initialValue.

QObjectBindableProperty::QObjectBindableProperty(const T &initialValue)

Создаёт свойство с предоставленным значением initialValue.

QObjectBindableProperty::QObjectBindableProperty()

Создаёт свойство со значениями по умолчанию типа T.

[default] QObjectBindableProperty::~QObjectBindableProperty()

Удаляет свойство.

template <typename Functor> QPropertyNotifier QObjectBindableProperty::addNotifier(Functor f)

Подписывает предоставленный функтор f как обратный вызов, который вызывается всякий раз, когда значение свойства изменяется.

Обратный вызов f должен быть типом, имеющим обычный оператор вызова () без параметров. Это означает, что вы можете предоставить выражение лямбда C++, std::function или даже пользовательскую структуру с оператором вызова.

Возвращаемый объект обработчика изменений свойства отслеживает подписку. Когда он выходит из области видимости, обратный вызов отписывается.

В некоторых случаях этот метод проще в использовании, чем onValueChanged(), так как возвращаемый объект не является шаблоном. Поэтому его легче хранить, например, как член класса.

См. также onValueChanged() и subscribe().

QPropertyBinding<T> QObjectBindableProperty::binding() const

Возвращает выражение привязки, связанное с этим свойством. Если такая ассоциация отсутствует, будет возвращена QPropertyBinding<T> со значениями по умолчанию.

См. также setBinding().

bool QObjectBindableProperty::hasBinding() const

Возвращает true, если свойство связано с привязкой; в противном случае — false.

void QObjectBindableProperty::notify()

Программно сигнализирует об изменении свойства. Любая привязка, зависящая от него, будет уведомлена, и если у свойства есть сигнал, он будет испущен.

Это может быть полезно в сочетании с setValueBypassingBindings для отсрочки сигнализации об изменении до восстановления инварианта класса.

Примечание: Если у этого свойства есть привязка (т. е. hasBinding() возвращает true), эта привязка не перевычисляется при вызове notify(). Любая привязка, зависящая от этого свойства, всё равно перевычисляется в обычном режиме.

См. также Qt::beginPropertyUpdateGroup() и setValueBypassingBindings().

template <typename Functor> QPropertyChangeHandler<Functor> QObjectBindableProperty::onValueChanged(Functor f)

Регистрирует предоставленный функтор f как обратный вызов, который должен вызываться всякий раз, когда значение свойства изменяется. При каждом изменении значения обработчик вызывается либо немедленно, либо откладывается в зависимости от контекста.

Обратный вызов f должен быть типом, имеющим обычный оператор вызова () без параметров. Это означает, что вы можете предоставить выражение лямбда C++, std::function или даже пользовательскую структуру с оператором вызова.

Возвращаемый объект обработчика изменений свойства отслеживает регистрацию. Когда он выходит из области видимости, обратный вызов отменяется.

QPropertyBinding<T> QObjectBindableProperty::setBinding(const QPropertyBinding<T> &newBinding)

Связывает значение этого свойства с предоставленным выражением newBinding и возвращает ранее связанную привязку. При первом чтении значения свойства выражение привязки вычисляется. При изменении зависимости выражения привязки оно перевычисляется при следующем чтении значения этого свойства. При изменении значения свойства владелец уведомляется через функцию обратного вызова.

См. также binding().

bool QObjectBindableProperty::setBinding(const QUntypedPropertyBinding &newBinding)

Это перегруженная функция.

Связывает значение этого свойства с предоставленным выражением newBinding. При первом чтении значения свойства выражение привязки вычисляется. При изменении зависимости выражения привязки оно перевычисляется при следующем чтении значения этого свойства.

Возвращает true, если тип этого свойства такой же, как тип, возвращаемый функцией привязки; false в противном случае.

template <typename Functor> QPropertyBinding<T> QObjectBindableProperty::setBinding(Functor f)

Это перегруженная функция.

Связывает значение этого свойства с предоставленным функтором f и возвращает ранее связанную привязку. При первом чтении значения свойства выражение привязки вычисляется, вызывая оператор вызова () для f. При изменении зависимости выражения привязки оно перевычисляется при следующем чтении значения этого свойства. При изменении значения свойства владелец уведомляется через функцию обратного вызова.

См. также Формирование привязки свойства.

template <typename Functor> QPropertyChangeHandler<Functor> QObjectBindableProperty::subscribe(Functor f)

Подписывает предоставленный функтор f как обратный вызов, который вызывается немедленно и всякий раз, когда значение свойства изменяется в будущем. При каждом изменении значения обработчик вызывается либо немедленно, либо откладывается в зависимости от контекста.

Обратный вызов f должен быть типом, имеющим обычный оператор вызова () без параметров. Это означает, что вы можете предоставить выражение лямбда C++, std::function или даже пользовательскую структуру с оператором вызова.

Возвращаемый объект обработчика изменений свойства отслеживает подписку. Когда он выходит из области видимости, обратный вызов отписывается.

QPropertyBinding<T> QObjectBindableProperty::takeBinding()

Отсоединяет выражение привязки от этого свойства и возвращает его. После вызова этой функции значение свойства будет изменяться только при присвоении нового значения или при установке новой привязки.

QObjectBindableProperty::parameter_type QObjectBindableProperty::value() const

Возвращает значение свойства. Это может вычислить выражение привязки, связанное с этим свойством, прежде чем вернуть значение.

См. также setValue().

Документация макроса

[since 6.0] Q_OBJECT_BINDABLE_PROPERTY(containingClass, type, name, signal)

Объявляет QObjectBindableProperty внутри containingClass типа type с именем name. Если необязательный аргумент signal задан, этот сигнал будет испускаться, когда свойство помечено как изменённое.

Эта функция была представлена в Qt 6.0.

См. также Система свойств Qt и Связанные свойства Qt.

[since 6.0] Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(containingClass, type, name, initialvalue, signal)

Объявляет QObjectBindableProperty внутри containingClass типа type с именем name, инициализированное значением initialvalue. Если необязательный аргумент signal задан, этот сигнал будет испускаться, когда свойство помечено как изменённое.

Эта функция была представлена в Qt 6.0.

См. также Система свойств Qt и Связанные свойства Qt.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qobjectbindableproperty.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API