聚合类

聚合::Aggregate

Aggregate类定义了一个相关组件集合,可以将其视为一个单元。 更多...

头文件 #include <aggregation/aggregate.h>
继承 QObject

注意:这个类中所有函数都是 线程安全的

公共函数

Aggregate(QObject *parent = nullptr)
虚函数~Aggregate() 覆盖
voidadd(QObject *component)
T *component()
QListcomponents()
voidremove(QObject *component)

信号

voidchanged()

静态公共成员

Aggregation::Aggregate *parentAggregate(QObject *obj)
T *query(QObject *obj)
QListquery_all(QObject *obj)

详细描述

聚合是一组作为单元处理的组件集合,其中每个组件将聚合中其他组件的属性和行为对外公开。具体来说就是

  • 它们可以被(使用查询()和查询_all()函数)互相转换。
  • 它们的生命周期是耦合的。也就是说,每当其中一个被删除时,所有都会。

组件可以是任何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);

下面的代码将删除所有三个:objectobjectExaggregate

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()

当组件被添加到或从聚合中删除时,将发出此信号。

另请参阅 add() 和 remove()。

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公司注册商标。所有其他商标均为各自所有者的财产。