Qt的; QWidget的删除和删除。 setParent(NULL)必要吗?

时间:2014-11-08 12:32:12

标签: c++ qt parent-child qwidget delete-operator

我一直在阅读Qwidgets的所有权并删除它们。 例如:http://qt-project.org/doc/qt-4.8/objecttrees.html

这说明"你也可以自己删除子对象,他们会将自己从父母那里移除#34;

然而,我见过很多例子,在删除之前将父设置为null。 例如:

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

是否需要setParent(NULL);

由此引出,我有什么理由不能做一个

delete layout->itemAt(i);

delete layout->takeAt(i);

事实上,最后两个之间有什么真正的区别吗? 我假设我的所有对象都在堆上。

1 个答案:

答案 0 :(得分:6)

在删除它之前,根本不需要将小部件的父级设置为NULL。子窗口小部件将在删除时自动从其父窗口注销。

对于您的第二个问题,itemAttakeAt之间的真正区别在于itemAt返回指定的布局项,takeAt也会返回它,但另外还要从布局中删除它

使用takeAt更改布局项目计数,因为它从布局中删除了返回的项目。所以要小心,不要在for ( int i = 0; i != layout->count(); ++i )这样的循环中使用它,因为你最终会得到比当前layout->count()更大的内容......

请注意,执行delete layout->itemAt(i);不会自动从布局中删除已删除的项目,因此必须避免这种情况。