如何删除窗口小部件上已存在的布局?

时间:2011-09-23 12:06:33

标签: qt qt4

  

您必须先 删除现有的布局管理器(由...返回)   layout()) ,然后才能使用新布局调用setLayout()。

来自http://doc.qt.io/qt-5.9/qwidget.html#setLayout

哪个函数用于删除先前的布局?

4 个答案:

答案 0 :(得分:15)

Chris Wilson的回答是正确的,但我发现布局不会删除它下面的子布局和qwidgets。如果你有复杂的布局或者你可能有内存泄漏,最好手动完成。

QLayout * layout = new QWhateverLayout();

// ... create complicated layout ...

// completely delete layout and sublayouts
QLayoutItem * item;
QLayout * sublayout;
QWidget * widget;
while ((item = layout->takeAt(0))) {
    if ((sublayout = item->layout()) != 0) {/* do the same for sublayout*/}
    else if ((widget = item->widget()) != 0) {widget->hide(); delete widget;}
    else {delete item;}
}

// then finally
delete layout;

答案 1 :(得分:14)

你只需使用

delete layout;

就像使用new创建的任何其他指针一样。

答案 2 :(得分:3)

我想删除当前布局,将其替换为新布局,但保持布局管理所有窗口小部件。我发现在这种情况下,Chris Wilson的解决方案效果不佳。布局并不总是改变。

这对我有用:

void RemoveLayout (QWidget* widget)
{
    QLayout* layout = widget->layout ();
    if (layout != 0)
    {
    QLayoutItem *item;
    while ((item = layout->takeAt(0)) != 0)
        layout->removeItem (item);
    delete layout;
    }
}

答案 3 :(得分:1)

我知道这个问题很老并且已经回答了,但是:由于QtAlgorithms提供了qDelteAll,因此可以删除布局,包括删除所有子版本的单行。

这是我在此处发布的文字的重复版:https://stackoverflow.com/a/35751235/3292513

此代码删除布局,其所有子项以及布局内的所有内容都“消失”。

qDeleteAll(yourWidget->children());

以下是重载函数的说明:

  

void qDeleteAll(ForwardIterator begin,ForwardIterator end)

     

使用C ++ delete>删除[开始,结束]范围内的所有项目。运营商。项类型必须是指针类型(例如,QWidget *)。

请注意,qDeleteAll需要从该窗口小部件(而不是该布局)提供容器。请注意,qDeleteAll不会删除yourWidget - 只删除它的子项。

现在可以设置新的布局。