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

Tob*_*oby 4 c++ qt parent-child qwidget delete-operator

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

这说"您也可以自己删除子对象,他们会将自己从父母身上移除"

但是我看到很多例子在删除它之前将父设置为null.例如:

if (widget != NULL)
{
    layout->removeWidget(widget); 
    widget->setParent(NULL);
    delete widget;
}
Run Code Online (Sandbox Code Playgroud)

有什么需要setParent(NULL);吗?

因此,我有什么理由不能做到这一点

delete layout->itemAt(i);
Run Code Online (Sandbox Code Playgroud)

要么

delete layout->takeAt(i);
Run Code Online (Sandbox Code Playgroud)

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

jpo*_*o38 7

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

对于你的第二个问题,itemAt和之间的真正区别takeAtitemAt返回指定的布局项,也takeAt返回它,但另外从布局中删除它.

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

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