QObjectBindableProperty 类

template <typename Class, typename T, auto Offset, auto Signal = nullptr> class QObjectBindableProperty

QObjectBindableProperty 类是一个模版类,它为存储在 QObject 派生类中的属性数据提供了自动属性绑定。更多...

头文件 #include <QObjectBindableProperty>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core
Qt 6.0
继承 QPropertyData

公共函数

QObjectBindableProperty()
QObjectBindableProperty(const T &initialValue)
QObjectBindableProperty(T &&initialValue)
QObjectBindableProperty(Functor &&f)
QObjectBindableProperty(Class *owner, const QPropertyBinding<T> &binding)
QObjectBindableProperty(Class *owner, QPropertyBinding<T> &&binding)
~QObjectBindableProperty()
QPropertyNotifieraddNotifier(Functor f)
QPropertyBinding<T>binding() const
boolhasBinding() const
voidnotify()
QPropertyChangeHandler<Functor>onValueChanged(Functor f)
QPropertyBinding<T>setBinding(const QPropertyBinding<T> &newBinding)
boolsetBinding(const QUntypedPropertyBinding &newBinding)
QPropertyBinding<T>setBinding(Functor f)
voidsetValue(QObjectBindableProperty<Class, T, Offset, Signal>::parameter_type newValue)
voidsetValue(QObjectBindableProperty<Class, T, Offset, Signal>::rvalue_ref newValue)
QPropertyChangeHandler<Functor>subscribe(Functor f)
QPropertyBinding<T>takeBinding()
QObjectBindableProperty<Class, T, Offset, Signal>::parameter_typevalue() const

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

详细描述

QObjectBindableProperty 是一个泛型容器,它包含 T 的一个实例,并且大多数行为与 QProperty 类似。它是实现 Qt 可绑定属性 的类之一。与 QProperty 不同,它在周围的 QObject 中存储其管理数据结构。额外的模板参数用于识别周围类和该类的一个成员函数,该函数用作变化处理器。

您可以使用 QObjectBindableProperty 来为使用 Q_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)

变化处理器可以可选地接受一个参数,该参数与属性类型相同,在这种情况下,它将传递属性的新值。否则,它应该不带参数。

如果属性不需要变化通知,您可以在 Q_PROPERTY 宏以及 Q_OBJECT_BINDABLE_PROPERTYQ_OBJECT_BINDABLE_PROPERTY_WITH_ARGS 宏的最后一个参数中省略 "NOTIFY xChanged"。

另请参阅 Q_OBJECT_BINDABLE_PROPERTYQ_OBJECT_BINDABLE_PROPERTY_WITH_ARGSQPropertyQObjectComputedPropertyQt 的属性系统Qt 可绑定属性

成员函数文档

void QObjectBindableProperty::setValue(QObjectBindableProperty<Class, T, Offset, Signal>::parameter_type newValue)

void QObjectBindableProperty::setValue(QObjectBindableProperty<Class, T, Offset, Signal>::rvalue_ref newValue)

newValue 赋给此属性,并在存在的情况下删除属性的相关绑定。如果属性值发生变化,则在 owner 上调用 Callback 函数。

QObjectBindableProperty::QObjectBindableProperty()

使用 T 的默认构造实例构造属性。

[显式] QObjectBindableProperty::QObjectBindableProperty(const T &initialValue)

使用提供的 initialValue 构造属性。

[显式] QοBJECT可绑定属性::QObjectBindableProperty(T &&initialValue)

构造一个具有给定 initialValue 的属性。

[显式] template <typename Functor> QοBJECT可绑定属性::QObjectBindableProperty(Functor &&f)

构造一个与提供的绑定表达式 f 绑定的属性。属性的值设置为新的绑定计算结果。每次绑定依赖项更改时,都会重新评估绑定,并根据需要相应地更新属性的值。

[默认] QοBJECT可绑定属性::QObjectBindableProperty(Class *owner, const QPropertyBinding<T> &binding)

构造一个与提供的 binding 表达式绑定的属性。属性的值设置为新的绑定计算结果。每次绑定依赖项更改时,都会重新评估绑定,并根据需要相应地更新属性的值。

当属性值更改时,通过回调函数通知 owner

[默认] QοBJECT可绑定属性::QObjectBindableProperty(Class *owner, QPropertyBinding<T> &&binding)

构造一个与提供的 binding 表达式绑定的属性。属性的值设置为新的绑定计算结果。每次绑定依赖项更改时,都会重新评估绑定,并根据需要相应地更新属性的值。

当属性值更改时,通过回调函数通知 owner

[默认] QοBJECT可绑定属性::~QObjectBindableProperty()

销毁属性。

template <typename Functor> QPropertyNotifier QοBJECT可绑定属性::addNotifier(Functor f)

将给定的函数对象 f 作为回调订阅,在属性值更改时调用。

回调 f 应该是一种类型,它有一个不带任何参数的plain call运算符 ()。这意味着您可以提供一个C++ lambda表达式、std::function或者甚至一个具有调用运算符的自定义结构。

返回的属性更改处理对象会跟踪订阅。当它超出作用域时,回调将被取消订阅。

在某些情况下,此方法比onValueChanged()() 更容易使用,因为返回的对象不是模板。因此,它更容易被存储,例如作为类的成员。

另请参阅onValueChanged() 和 subscribe()。

QPropertyBinding<T> QοBJECT可绑定属性::binding() const

返回与该属性关联的绑定表达式。如果没有此类关联,将返回默认构造的 QPropertyBinding<T>。

另请参阅setBinding()。

bool QοBJECT可绑定属性::hasBinding() const

如果属性与绑定相关联,则返回 true;否则返回 false。

void QοBJECT可绑定属性::notify()

通过编程方式触发属性变化信号。任何依赖于它的绑定都将被通知,如果该属性有一个信号,则将发出该信号。

这可以与setValueBypassingBindings结合使用,以延迟信号变化,直到类的不变式得以恢复。

注意:如果此属性有一个绑定(即hasBinding() 返回true),则在调用notify()时,该绑定不会被重新评估。依赖于该属性的任何绑定仍按常规重新评估。

另请参阅:Qt::beginPropertyUpdateGroup() 和 setValueBypassingBindings

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

将给定的函数[i]注册为回调,在属性值变化时调用该回调。每次值变化时,处理程序将根据上下文立即调用或延迟调用。

回调 f 应该是一种类型,它有一个不带任何参数的plain call运算符 ()。这意味着您可以提供一个C++ lambda表达式、std::function或者甚至一个具有调用运算符的自定义结构。

返回的属性变化处理程序对象跟踪注册。当它超出范围时,回调将被注销。

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

将此属性的值与提供的[i]新绑定表达式关联,并返回先前关联的绑定。将属性值设置为评估新绑定的结果。每当绑定的依赖项发生变化时,将重新评估该绑定,并相应地更新属性值。当属性值变化时,将通过回调函数通知所有者。

另请参阅:binding

bool QObjectBindableProperty::setBinding(const QUntypedPropertyBinding &newBinding)

这是重载函数。

将此属性的值与提供的[i]新绑定表达式关联。将属性值设置为评估新绑定的结果。每当绑定的依赖项发生变化时,将重新评估该绑定,并相应地更新属性值。

如果此属性的类型与绑定函数返回的类型相同,则返回true;否则返回false

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

这是重载函数。

将此属性的值与提供的函数[i]关联,并返回先前关联的绑定。将属性值设置为通过调用[i]的调用操作符()评估新绑定的结果。每当绑定的依赖项发生变化时,将重新评估该绑定,并相应地更新属性值。

当属性值变化时,将通知所有者。

另请参阅:定义属性绑定

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

将给定的泛型函数f作为回调立即调用,并在将来该属性的值发生变化时调用。每当属性值发生变化时,处理程序要么立即调用,要么根据上下文延迟调用。

回调 f 应该是一种类型,它有一个不带任何参数的plain call运算符 ()。这意味着您可以提供一个C++ lambda表达式、std::function或者甚至一个具有调用运算符的自定义结构。

返回的属性更改处理对象会跟踪订阅。当它超出作用域时,回调将被取消订阅。

QPropertyBinding<T> QObjectBindableProperty::takeBinding()

断开绑定表达式与该属性的关联,并返回它。调用此函数后,只有当你为其赋新值或设置新绑定时,属性的值才会更改。

QObjectBindableProperty<Class, T, Offset, Signal>::parameter_type QObjectBindableProperty::value() const

返回属性的值。在返回值之前,这可能会评估与该属性绑定的绑定表达式。

另请参阅 setValue

宏文档

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

containingClass 内声明一个类型为 type、名称为 nameQObjectBindableProperty。如果提供了可选的参数 signal,则当属性被标记为脏时,将发出此信号。

此宏从 Qt 6.0 开始引入。

另请参阅 Qt的属性系统Qt可绑定属性

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

containingClass 内声明一个类型为 type、名称为 name 且初始化为 initialvalueQObjectBindableProperty。如果提供了可选的参数 signal,则当属性被标记为脏时,将发出此信号。

此宏从 Qt 6.0 开始引入。

另请参阅 Qt的属性系统Qt可绑定属性

© 2024 The Qt Company Ltd. 所包含的文档贡献是各自所有者的版权。此处提供的文档是根据自由软件基金会的定义,按照GNU自由文档许可协议版本1.3的条款提供的。Qt和相应的标志是The Qt Company Ltd.在芬兰和/或其他国家的商标。所有其他商标均为其各自所有者的财产。