在不删除部件的情况下清除布局
Clearing Layouts without deleting widgets
我目前有一个垂直布局,其中包含多个布局,其中有小部件。现在我要删除垂直布局中的所有布局。目前我正在使用以下方法。它清除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);
}
这是一个非常基本的例子,可能可以做得更好,但希望能给你指明正确的方向。
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- libQGLViewer 如何在没有清除缓冲区的情况下绘制
- SDL2:如何在不清除屏幕的情况下渲染
- 如何在没有递归的情况下清除四叉树(也许使用队列?).
- 为什么回调标志在没有明显原因的情况下被清除和/或损坏
- 在不删除部件的情况下清除布局
- 如何输出到控制台,并在不清除屏幕和重写所有内容的情况下覆盖文本
- vector在没有交互的情况下被清除