2014-11-08 116 views
4

我一直在阅读Qwidgets的所有权并删除它们。 如:http://qt-project.org/doc/qt-4.8/objecttrees.htmlQt; QWidget删除和删除。 setParent(NULL)是否必要?

这是说“你也可以删除子对象自己,他们会从他们的父母自行拆除”

但是很多我所看到的设置父为NULL删除之前的例子。 如:

if (widget != NULL) 
{ 
    layout->removeWidget(widget); 
    widget->setParent(NULL); 
    delete widget; 
} 

是否有任何需要的setParent(NULL);

从这个领先的,是没有任何理由,为什么我不能只是做一个

delete layout->itemAt(i); 

delete layout->takeAt(i); 

其实,有没有这最后两者之间有什么真正的区别? 我假设我所有的物体都堆在堆上。

回答

5

在删除它之前,绝对不需要将小部件的父项设置为NULL。删除后,子窗口小部件将自动从其父节点注销。

关于第二个问题,itemAttakeAt之间真正的区别在于itemAt返回指定版面项目,takeAt回报它过于但additionaly从布局中删除。

使用takeAt更改布局项目数,因为它从布局中移除了返回的项目。所以,要小心,不要使用它像for (int i = 0; i != layout->count(); ++i)一个循环,因为你与我比当前更大layout->count()结束了......

注意,这样做delete layout->itemAt(i);不会自动从布局中删除已删除的项目,所以这必须避免。

+0

非常好,这证实了我的想法。 我会避免删除layout-> itemAt(i)如果它不能被测试信任。谢谢! – Toby 2014-11-08 13:19:11