QObject 自毁感知容器

Posted

技术标签:

【中文标题】QObject 自毁感知容器【英文标题】:QObject selfdestruction aware container 【发布时间】:2015-03-17 12:10:01 【问题描述】:

是否有一个 Qt 容器,它知道 QObject 的被破坏信号并在元素被破坏时移除元素?

即像这样:

QObject *obj1 = new MyObject();
QObject *obj2 = new MyObject();
QObjectContainer c;
c.add(obj1);
c.add(obj2);
qDebug() << c.size(); // Prints 2
delete obj1;
qDebug() << c.size(); // Prints 1

【问题讨论】:

等等,你的想法有缺陷。如果你删除一个对象,你将如何在数组中找到它的索引?您每次都需要执行完整的搜索。想一想,它不能以任何合理的方式实现。即使您的数组捕获到destroyed() 信号,它也只会获取指针的地址,而不是它在数组中的索引。您需要按值搜索它。表现会很糟糕。 将您的对象添加为虚拟父 QObject 的子对象 ;-) 【参考方案1】:

您可以通过在container 派生类中捕获信号destroyed() 来自己完成。

附:没有 Qt 类这样做,AFAIK。

【讨论】:

【参考方案2】:

当指向的对象被删除时,QPointer 会自动清除

【讨论】:

好吧,如果指向的包含对象被删除,那么有一个列表将删除 QPointer。 @ManuelSchneid3r 你可以在迭代过程中做一些簿记,虽然索引列表可能不是一个好主意,而是一个类似集合的容器会更好。

以上是关于QObject 自毁感知容器的主要内容,如果未能解决你的问题,请参考以下文章

非 QObject 内的 Qt 容器

Qt构造函数的参数:QObject *parent = Q_NULLPTR

为啥我可以将 QObject* 分配给 QObject?

QObject 作为另一个 QObject 的字段?

编译器错误 C2248:“QObject::Qobject”:无法访问在类“QObject”中声明的私有成员

Qt入门教程QObject篇QObject类