Qt; QWidget 移除和删除。 setParent(NULL) 有必要吗?
Posted
技术标签:
【中文标题】Qt; QWidget 移除和删除。 setParent(NULL) 有必要吗?【英文标题】:Qt; QWidget removal and deletion. setParent(NULL) necessary? 【发布时间】:2014-11-08 12:32:11 【问题描述】:我一直在阅读 Qwidget 的所有权并删除它们。 例如:http://qt-project.org/doc/qt-4.8/objecttrees.html
这表示“您也可以自己删除子对象,它们会将自己从父对象中删除”
但是,我看到很多示例在删除父项之前将其设置为 null。 例如:
if (widget != NULL)
layout->removeWidget(widget);
widget->setParent(NULL);
delete widget;
setParent(NULL);
有需要吗?
从这里开始,我有什么理由不能做一个
delete layout->itemAt(i);
或
delete layout->takeAt(i);
事实上,最后两者之间有什么真正的区别吗? 当然,我假设我所有的对象都在堆上。
【问题讨论】:
【参考方案1】:在删除之前绝对不需要将小部件的父级设置为NULL
。删除后,子小部件将自动从其父小部件中注销。
对于第二个问题,itemAt
和 takeAt
之间的真正区别在于 itemAt
返回指定的布局项,takeAt
也返回它,但另外将其从布局中删除。
使用takeAt
会更改布局项计数,因为它会从布局中删除返回的项。所以要小心,不要在像 for ( int i = 0; i != layout->count(); ++i )
这样的循环中使用它,因为你最终会得到 i 大于当前 layout->count()
...
请注意,delete layout->itemAt(i);
不会自动从布局中删除已删除的项目,因此必须避免这种情况。
【讨论】:
非常好,这证实了我的想法。如果不能信任测试,我将避免删除布局->itemAt(i)。谢谢!以上是关于Qt; QWidget 移除和删除。 setParent(NULL) 有必要吗?的主要内容,如果未能解决你的问题,请参考以下文章