原因:

有时我们需要在程序中动态添加布局或控件等,下面用程序来展示一下相应的方法:

效果:

Qt 在程序中动态添加 删除 View 布局 或控件_动态布局

 点击删除:

Qt 在程序中动态添加 删除 View 布局 或控件_qt_02

 删除所有控件:

实现如下:

testlayout.h

#ifndef TESTLAYOUT_H
#define TESTLAYOUT_H

#include <QWidget>
#include <QPushButton>
#include <QGroupBox>
#include <QVBoxLayout>

class TestLayout : public QWidget
{
Q_OBJECT
public:
explicit TestLayout(QWidget *parent = nullptr);

void removeAllWidget();
signals:

public slots:


private:
QWidget* m_Parent;

QGroupBox* buttonGroup;
QVBoxLayout* widgetLayout;
QList<QPushButton*> m_TrackerButtonList;
};

#endif // TESTLAYOUT_H

testlayout.cpp

#include "testlayout.h"

TestLayout::TestLayout(QWidget *parent) : QWidget(parent),widgetLayout(nullptr)
{
m_Parent = parent;

for (int i = 0; i < 7; i++)
{
QPushButton *button = new QPushButton("");
button->setFixedSize(QSize(60 , 20 ));
button->setStyleSheet(QString("border: 1px solid #323232; \
border-radius:0px; \
padding:0px 0px; \
background-color:#126215;"));
this->m_TrackerButtonList.push_back(button);
}

QHBoxLayout* trackerLayout = new QHBoxLayout();
trackerLayout->setObjectName("trackerButtonLayout");
trackerLayout->setContentsMargins(5, 5, 5, 5);
trackerLayout->addStretch();


for (size_t i = 0; i < this->m_TrackerButtonList.size(); i++)
{
trackerLayout->addWidget(this->m_TrackerButtonList[i]);
trackerLayout->addStretch();
}


buttonGroup = new QGroupBox();
buttonGroup->setLayout(trackerLayout);
buttonGroup->setStyleSheet(QString("border: 1px solid #323232; \
border-radius:0px; \
padding:0px 0px; \
background-color:#121315;"));


widgetLayout = new QVBoxLayout(m_Parent);
widgetLayout->addWidget(buttonGroup);

this->setLayout(widgetLayout);
}

void TestLayout::removeAllWidget()
{

QLayout* _layout = this->layout();
if (_layout)
{
int xdd = _layout->count();
for (int i = 0; i < _layout->count(); ++i)
{
if (QLayoutItem* _item = _layout->itemAt(i))
{
if (QWidget* _itemWidget = _item->widget())
{
_itemWidget->setParent(NULL);
_layout->removeWidget(_itemWidget);
}

else
delete _layout->takeAt(i);
}
}
}

}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

mTestLayout = new TestLayout(this);
ui->verticalLayout->insertWidget(0,mTestLayout);
// ui->verticalLayout->addWidget(mTestLayout);
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::on_pushButton_clicked()
{

mTestLayout->removeAllWidget();
// mTestLayout->show();
//ui->verticalLayout->removeWidget(mTestLayout);
// this->update();
}