聚合类
类 聚合::AggregateAggregate类定义了一个相关组件集合,可以将其视为一个单元。 更多...
头文件 | #include <aggregation/aggregate.h> |
继承 | QObject |
注意:这个类中所有函数都是 线程安全的。
公共函数
Aggregate(QObject *parent = nullptr) | |
虚函数 | ~Aggregate() 覆盖 |
void | add(QObject *component) |
T * | component() |
QListcomponents() | |
void | remove(QObject *component) |
信号
void | changed() |
静态公共成员
Aggregation::Aggregate * | parentAggregate(QObject *obj) |
相关非成员
详细描述
聚合是一组作为单元处理的组件集合,其中每个组件将聚合中其他组件的属性和行为对外公开。具体来说就是
组件可以是任何QObject派生类型。
您可以使用聚合来通过聚合模拟多重继承。假设我们有以下代码
using namespace Aggregation; class MyInterface : public QObject { ........ }; class MyInterfaceEx : public QObject { ........ }; [...] MyInterface *object = new MyInterface; // this is single inheritance
查询函数的行为类似于正常的qobject_cast()
Q_ASSERT(query<MyInterface>(object) == object); Q_ASSERT(query<MyInterfaceEx>(object) == 0);
如果我们想object
还实现MyInterfaceEx
类,但又不想或不能使用多重继承,我们可以使用聚合在任何时候实现
MyInterfaceEx *objectEx = new MyInterfaceEx; Aggregate *aggregate = new Aggregate; aggregate->add(object); aggregate->add(objectEx);
聚合将两个对象打包在一起。如果我们有集合的任何部分,我们就能得到所有的部分
Q_ASSERT(query<MyInterface>(object) == object); Q_ASSERT(query<MyInterfaceEx>(object) == objectEx); Q_ASSERT(query<MyInterface>(objectEx) == object); Q_ASSERT(query<MyInterfaceEx>(objectEx) == objectEx);
下面的代码将删除所有三个:object
、objectEx
和aggregate
delete objectEx; // or delete object; // or delete aggregate;
了解聚合的代码永远不会使用qobject_cast(). 它始终使用Aggregation::query(),其行为类似于qobject_cast()作为后备。
成员函数文档
Aggregate::Aggregate(QObject *parent = nullptr)
创建一个新的聚合,具有给定的parent。父对象直接传递给类的QObject部分,并且除了这个之外没有其他用途。
[覆盖虚函数 noexcept]
聚合类::~聚合类()
删除聚合将自动删除其所有组件。
void 聚合类::add(QObject *组件)
将组件 添加到聚合中。不能添加属于不同聚合或聚合本身的组件。
另请参阅 remove()。
[信号]
void 聚合类::changed()
当组件被添加到或从聚合中删除时,将发出此信号。
template <typename T> T *聚合类::component()
模板函数,返回具有指定类型的组件,如果存在的话。如果有多个具有该类型的组件,则任意返回一个。
另请参阅 Aggregate::components() 和 add。
template <typename T> QList<T *> 聚合类::components()
模板函数,返回所有具有指定类型的组件,如果存在的话。
另请参阅 Aggregate::component() 和 add。
[静态]
聚合类::聚合 *聚合类::parentAggregate(QObject *obj)
如果obj 有聚合对象,则返回它。否则返回0。
void 聚合类::remove(QObject *组件)
从聚合中删除组件。
另请参阅 add。
相关非成员
template <typename T> T *query(QObject *obj)
执行一个动态转换,此转换知晓对象可能所属的聚合。如果叩本身就是请求的类型,它就会被简单地转换并返回。否则,如果叩属于聚合,检查所有组件。如果它不属于聚合,则返回null。
另请参阅 Aggregate::component。
template <typename T> QList<T *> query_all(QObject *obj)
如果叩属于聚合,则返回所有可以转换为给定类型的组件。否则,如果叩是请求的类型,则返回叩。
另请参阅 Aggregate::components。
©2024 本文档中的Qt公司文档贡献是各自所有者的版权。此处提供的文档是根据自由软件开发基金会发布的《GNU自由文档许可证》第1.3版许可的。Qt及其相关标志是芬兰及其它全球国家的Qt公司注册商标。所有其他商标均为各自所有者的财产。