QObjectBindableProperty 类
template <typename Class, typename T, auto Offset, auto Signal = nullptr> class QObjectBindablePropertyQObjectBindableProperty 类是一个模版类,它为存储在 QObject 派生类中的属性数据提供了自动属性绑定。更多...
头文件 | #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(const T &initialValue) | |
QObjectBindableProperty(T &&initialValue) | |
QObjectBindableProperty(Functor &&f) | |
QObjectBindableProperty(Class *owner, const QPropertyBinding<T> &binding) | |
QObjectBindableProperty(Class *owner, 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) |
bool | setBinding(const QUntypedPropertyBinding &newBinding) |
QPropertyBinding<T> | setBinding(Functor f) |
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 |
宏
(自 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_PROPERTY 和 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS 宏的最后一个参数中省略 "NOTIFY xChanged"。
另请参阅 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 上调用 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、名称为 name 的 QObjectBindableProperty。如果提供了可选的参数 signal,则当属性被标记为脏时,将发出此信号。
此宏从 Qt 6.0 开始引入。
[since 6.0]
Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(containingClass, type, name, initialvalue, signal)
在 containingClass 内声明一个类型为 type、名称为 name 且初始化为 initialvalue 的 QObjectBindableProperty。如果提供了可选的参数 signal,则当属性被标记为脏时,将发出此信号。
此宏从 Qt 6.0 开始引入。
© 2024 The Qt Company Ltd. 所包含的文档贡献是各自所有者的版权。此处提供的文档是根据自由软件基金会的定义,按照GNU自由文档许可协议版本1.3的条款提供的。Qt和相应的标志是The Qt Company Ltd.在芬兰和/或其他国家的商标。所有其他商标均为其各自所有者的财产。