在不删除部件的情况下清除布局

Clearing Layouts without deleting widgets

本文关键字:情况下 清除 布局 删除部      更新时间:2023-10-16

我目前有一个垂直布局,其中包含多个布局,其中有小部件。现在我要删除垂直布局中的所有布局。目前我正在使用以下方法。它清除ui中的布局。问题是这个方法只有在方法中的deleteWidgets参数为true时才清除ui,否则ui不会被清除(项目仍然在布局中)。关于如何在不删除小部件的情况下清除布局,有什么建议吗?

然后使用以下代码

while(layout->count() != 0)
    {
        layout->removeItem( layout->itemAt(0));
    }

现在,当我在布局上调用计数时,项数是0。然而,布局似乎仍然有项目在ui ?为什么?

你想用这些小部件做什么?如果你不想删除它们,你应该改变它们的父元素,如果你仍然想显示它们,可以把它们放在一个新的布局中,或者把它们移到父元素中并隐藏它们。如果您使用后一种方法,最好将带有指针的成员变量保存在列表中,但假设foo继承了QWidget,那么下面对代码的修改应该可以工作,尽管存储小部件并直接操作它们将是一个更好的解决方案。

void foo::clearLayout(QLayout* layout, bool deleteWidgets)
{
    while (QLayoutItem* item = layout->takeAt(0))
    {
        if (QWidget* widget = item->widget())
        {            
            if (deleteWidgets)
            {
                delete widget;
            }
            else
            {
                // note you will need to call show on this widget
                // before it is visible again.
                widget->setParent(this);
            }
        if (QLayout* childLayout = item->layout())
             clearLayout(childLayout, deleteWidgets);
        delete item;
    }
}

上面的例子也不处理间隔符项。

另一种方式(不保证编译)的基本示例

foo。

#include <QWidget>
// Forward declare classes that will be used
class QLabel;
class QPushButton;
class foo: public QWidget
{
    Q_OBJECT
public:
     explicit foo(QWidget * parent);
public slots:
     void swapToVLayout();
     void swapToHLayout();
private:
     void clearLayout(QLayout* layout);
private:
     QLabel * label;
     QLabel * label2;
     QPushButton * button;

foo.cpp

#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include "foo.h"
foo::foo(parent) : QWidget(parent)
{
    label = new QLabel();
    label2 = new QLabel();
    button = new button();
    QHBoxLayout * layout = new QHBoxLayout();
    layout->addWidget(label);
    QVBoxLayout * layout2 = new QVBoxLayout();
    layout2->addWidget(label2);
    layout2->addWidget(button);
    layout->addLayout(layout2);
    setLayout(layout);
}
void foo::setVLayout()
{
    clearLayout(layout(), false);
    QVBoxLayout * vLayout = new QVBoxLayout();
    vLayout->addWidget(label);
    vLayout->addWidget(label2);
    vLayout->addWidget(button);
    setLayout(vLayout);
}

这是一个非常基本的例子,可能可以做得更好,但希望能给你指明正确的方向。