清除布局而不删除小部件

时间:2014-06-02 00:56:30

标签: c++ qt layout

我目前有一个垂直布局,托管多个布局,里面有小部件。现在我想删除垂直布局中的所有布局。目前我使用以下方法。这清除了ui中的布局。问题是此方法仅在方法中的deleteWidgets参数为true时清除ui,否则不清除ui(项目仍在布局中)。关于如何在不删除小部件的情况下清除布局的任何建议。

然后我使用了以下代码

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

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

1 个答案:

答案 0 :(得分:1)

你想用小部件做什么?如果您不想删除它们,则应更改父级,方法是将它们置于新布局中,如果您仍想要显示它们或将它们移动到父级并隐藏它们。如果您正在执行稍后的操作,最好将成员变量与指针保持在一个列表中,但是假设foo继承QWidget,以下代码的调整应该起作用,尽管存储小部件并直接操作它们将是一个更好的解决方案。 / p>

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.h中

#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);
}

这是一个非常基本的例子,可能会做得更好,但希望能让你朝着正确的方向前进。