【问题标题】:Qt; QWidget removal and deletion. setParent(NULL) necessary?Qt; QWidget 移除和删除。 setParent(NULL) 有必要吗?
【发布时间】: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);

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

【问题讨论】:

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


    【解决方案1】:

    在删除之前绝对不需要将小部件的父级设置为NULL。删除后,子小部件将自动从其父小部件中注销。

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

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

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

    【讨论】:

    • 非常好,这证实了我的想法。如果不能信任测试,我将避免删除布局->itemAt(i)。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2016-12-02
    • 2021-02-16
    • 2017-03-12
    相关资源
    最近更新 更多