我目前有一个垂直布局,托管多个布局,里面有小部件。现在我想删除垂直布局中的所有布局。目前我使用以下方法。这清除了ui中的布局。问题是此方法仅在方法中的deleteWidgets参数为true时清除ui,否则不清除ui(项目仍在布局中)。关于如何在不删除小部件的情况下清除布局的任何建议。
然后我使用了以下代码
while(layout->count() != 0)
{
layout->removeItem( layout->itemAt(0));
}
现在,当我在布局上调用计数时,项目为0.但是布局似乎仍然在ui上有项目?那是为什么?
答案 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);
}
这是一个非常基本的例子,可能会做得更好,但希望能让你朝着正确的方向前进。