c++ - Qt; QWidget 移除和删除。 setParent(NULL) 有必要吗?

标签 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;
}

是否需要 setParent(NULL);

从这里开始,有什么理由让我不能只做一个

delete layout->itemAt(i);

delete layout->takeAt(i);

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

最佳答案

绝对没有必要在删除之前将小部件的父级设置为NULL。删除后,子窗口小部件将自动从其父窗口注销。

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

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

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

关于c++ - Qt; QWidget 移除和删除。 setParent(NULL) 有必要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26817169/

相关文章:

c - fork 和管道 : does this C program contain a race condition?

html - 列表中第一个 li 的选择器

c++ - 使用模板实现接口(interface)的类的模板

c++ - 为什么在C++ big endian中使用bitshift转换为int16无效?

qt - QML 组件按淡入淡出顺序加载

mysql - 如何查询 MySql 表以显示根及其子项。

c++ - 堆栈溢出 : Duplicate temporary allocation in stack space?

C++ 多重继承知道它是否在直接层次结构路径之外的 "is a"类

c++ map,在使用扩展for循环迭代时删除元素是否安全?

c++ - 将 QListView 添加到 QComboBox 以正确显示滚动条