• 8291阅读
  • 6回复

[已解决]为什么QLayout等布局管理器,不显示调用delete? [复制链接]

上一主题 下一主题
离线huang_yj
 
只看楼主 倒序阅读 楼主  发表于: 2010-01-20
— 本帖被 XChinux 执行加亮操作(2010-01-26) —
大家好,我在Qt的example程序中总是看见如下的类似代码:

QVBoxLayout *mainLayout = new QVBoxLayout;
...
setLayout(mainLayout);

mainLayout被构造时并没有传parent指针给父窗口,也没有在析构函数里被delete。那么mainLayout是何时被删除的呢?
[ 此帖被huang_yj在2010-01-25 23:14重新编辑 ]
离线yangfanxing
只看该作者 1楼 发表于: 2010-01-20
app()退出的时候。似乎只有这个可能了。。。
有父窗口的有时候关闭父窗口也不是真正地销毁指针。
PHPWind好恶心。。。不想看这种界面。。。
离线lxbin2003

只看该作者 2楼 发表于: 2010-01-21
setLayout的时候,你怎么知道没有保存指针?
要了解这个问题,最好去看看源码.
离线cspp

只看该作者 3楼 发表于: 2010-01-21
void QWidget::setLayout(QLayout *l)
{
    if (!l) {
        qWarning("QWidget::setLayout: Cannot set layout to 0");
        return;
    }
    if (layout()) {
        if (layout() != l)
            qWarning("QWidget::setLayout: Attempting to set QLayout \"%s\" on %s \"%s\", which already has a"
                     " layout", l->objectName().toLocal8Bit().data(), metaObject()->className(),
                     objectName().toLocal8Bit().data());
        return;
    }

    QObject *oldParent = l->parent();
    if (oldParent && oldParent != this) {
        if (oldParent->isWidgetType()) {
            // Steal the layout off a widget parent. Takes effect when
            // morphing laid-out container widgets in Designer.
            QWidget *oldParentWidget = static_cast<QWidget *>(oldParent);
            oldParentWidget->takeLayout();
        } else {
            qWarning("QWidget::setLayout: Attempting to set QLayout \"%s\" on %s \"%s\", when the QLayout already has a parent",
                     l->objectName().toLocal8Bit().data(), metaObject()->className(),
                     objectName().toLocal8Bit().data());
            return;
        }
    }

    Q_D(QWidget);
    l->d_func()->topLevel = true;
    d->layout = l;
    if (oldParent != this) {
        l->setParent(this); <--------------------------------------------------
        l->d_func()->reparentChildWidgets(this);
        l->invalidate();
    }

    if (isWindow() && d->maybeTopData())
        d->topData()->sizeAdjusted = false;
}
离线午小夜

只看该作者 4楼 发表于: 2010-01-22
看看析構函數:
/*!
    Destroys this box layout.

    The layout's widgets aren't destroyed.
*/
QBoxLayout::~QBoxLayout()
{
    Q_D(QBoxLayout);
    d->deleteAll(); // must do it before QObject deletes children, so can't be in ~QBoxLayoutPrivate
}
[ 此帖被午小夜在2010-01-22 10:41重新编辑 ]
[操作系统版本]  Windows XP;Linux Ubuntu;Linux Fedora;
[Qt SDK版本]    4.7.0
[SDK 发布日期]  2010.05
[IDE(集成开发环境)] QtCreator
个人网页:http://hi.baidu.com/午小夜
學歷:Royal Jalidon
离线huang_yj
只看该作者 5楼 发表于: 2010-01-25
原谅我好几天没有看自己的发的帖子,家里断网一周了。
仔细看了下Qt文档:
void QWidget::setLayout ( QLayout * layout )
The QWidget will take ownership of layout.
由调用它的Widget析构layout.

最后谢谢大家的探讨。
离线darrenmu

只看该作者 6楼 发表于: 2010-04-30
此贴很经典。参考
快速回复
限100 字节
 
上一个 下一个