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 自毁感知容器的主要内容,如果未能解决你的问题,请参考以下文章
Qt构造函数的参数:QObject *parent = Q_NULLPTR