QObjectBindableProperty Class

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

QObjectBindableProperty 类是一个模板类,可对存储在QObject 派生类中的属性数据进行自动属性绑定。更多

Header: #include <QObjectBindableProperty>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Qt 6.0
继承于 QPropertyData

公共函数

QObjectBindableProperty()
QObjectBindableProperty(Functor &&f)
QObjectBindableProperty(T &&initialValue)
QObjectBindableProperty(const T &initialValue)
QObjectBindableProperty(Class *owner, QPropertyBinding<T> &&binding)
QObjectBindableProperty(Class *owner, const QPropertyBinding<T> &binding)
~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)
QPropertyBinding<T> setBinding(Functor f)
bool setBinding(const QUntypedPropertyBinding &newBinding)
void setValue(QObjectBindableProperty<Class, T, Offset, Signal>::parameter_type newValue)
void setValue(QObjectBindableProperty<Class, T, Offset, Signal>::rvalue_ref newValue)
QPropertyChangeHandler<Functor> subscribe(Functor f)
QPropertyBinding<T> takeBinding()
QObjectBindableProperty<Class, T, Offset, Signal>::parameter_type value() const

(since 6.0) Q_OBJECT_BINDABLE_PROPERTY(containingClass, type, name, signal)
(since 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>classFoo :publicQObject
{ Q_OBJECT Q_PROPERTY(intmyVal READ myVal WRITE setMyVal BINDABLE bindableMyVal)public:intmyVal() {returnmyValMember.value(); }voidsetMyVal(intnewvalue) { myValMember=newvalue; } QBindable<int>bindableMyVal() {return &myValMember; }信号voidmyValChanged();private: Q_OBJECT_BINDABLE_PROPERTY(Foo, int,myValMember, &Foo::myValChanged); };intmain() {booldebugout(true);// 启用调试日志Foo myfoo;    QProperty<int>prop(42);    QObject::connect(&myfoo, &Foo::myValChanged, [&]() {if(debugout)            qDebug() << myfoo.myVal();
    }); myfoo.bindableMyVal().setBinding([&]() {returnprop.value(); });// prints "42"prop= 5;// prints "5"debugout= false; prop= 6;// prints nothingdebugout= 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 宏中的 "NOTIFY xChanged "以及Q_OBJECT_BINDABLE_PROPERTYQ_OBJECT_BINDABLE_PROPERTY_WITH_ARGS 宏的最后一个参数。

另请参阅 Q_OBJECT_BINDABLE_PROPERTY,Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS,QProperty,QObjectComputedProperty,Qt 的属性系统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 上的回调函数。

QObjectBindableProperty::QObjectBindableProperty()

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

[explicit] template <typename Functor> QObjectBindableProperty::QObjectBindableProperty(Functor &&f)

构造一个与所提供的绑定表达式f 绑定的属性。该属性的值将设置为新绑定的评估结果。每当绑定的依赖关系发生变化时,绑定将被重新评估,属性值也会相应更新。

[explicit] QObjectBindableProperty::QObjectBindableProperty(T &&initialValue)

移动-使用提供的initialValue 构建一个属性。

[explicit] QObjectBindableProperty::QObjectBindableProperty(const T &initialValue)

用提供的initialValue 构建一个属性。

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

构造一个与所提供的binding 表达式绑定的属性。该属性的值将被设置为新绑定的评估结果。每当绑定的依赖关系发生变化时,绑定就会重新评估,属性值也会相应更新。

当属性值发生变化时,owner 会通过回调函数收到通知。

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

构造一个与所提供的binding 表达式绑定的属性。该属性的值将被设置为新绑定的评估结果。每当绑定的依赖关系发生变化时,绑定就会重新评估,属性值也会相应更新。

当属性值发生变化时,owner 会通过回调函数收到通知。

[default] QObjectBindableProperty::~QObjectBindableProperty()

破坏财产。

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

将给定的函数f 订阅为回调,每当属性值发生变化时就会调用该回调。

回调f 应该是一个不带任何参数的普通调用操作符类型() 。这意味着您可以提供 C++ lambda 表达式、std::函数,甚至是带有调用操作符的自定义结构体。

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

在某些情况下,这种方法比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++ lambda 表达式、std::函数,甚至是带有调用操作符的自定义结构体。

返回的属性更改处理程序对象会跟踪注册情况。当它退出作用域时,回调将被注销。

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

将此属性的值与所提供的newBinding 表达式关联,并返回先前关联的绑定。该属性的值将被设置为新绑定的评估结果。只要绑定的依赖关系发生变化,绑定就会重新评估,属性值也会相应更新。当属性值发生变化时,所有者会通过回调函数收到通知。

另请参阅 binding().

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

这是一个重载函数。

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

当属性值发生变化时,所有者会通过回调函数收到通知。

另请参阅 制定属性绑定

bool QObjectBindableProperty::setBinding(const QUntypedPropertyBinding &newBinding)

这是一个重载函数。

将此属性的值与所提供的newBinding 表达式关联。属性值将被设置为新绑定的评估结果。每当绑定的依赖关系发生变化时,绑定将被重新评估,属性值也会相应更新。

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

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

将给定的函数式f 作为回调函数订阅,该回调函数会在属性值发生变化时立即调用。每次属性值发生变化时,都会根据上下文立即或延迟调用处理程序。

回调f 应该是一个不带任何参数的纯调用操作符类型() 。这意味着您可以提供 C++ lambda 表达式、std::函数,甚至是带有调用操作符的自定义结构体。

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

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 中声明一个QObjectBindableProperty ,类型为type ,名称为name 。如果给定了可选参数signal ,则当属性被标记为 dirty 时将发出该信号。

此宏在 Qt 6.0 中引入。

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

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

containingClass 内声明一个QObjectBindableProperty ,其类型为type ,名称为name ,初始化为initialvalue 。如果给定了可选参数signal ,当属性被标记为 dirty 时将发出该信号。

此宏在 Qt 6.0 中引入。

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

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.