Created simple project, to figure how it works. I've added in main window verticalLayout, func to clear layouts:
void MainWindow::clear()
{
QLayoutItem *child;
while ((child = ui->verticalLayout->takeAt(0)) != nullptr)
{
delete child->widget(); // delete the widget
delete child; // delete the layout item
}
}
in MainWindow constructor creating buttons:
for (int var = 0; var < 5; ++var) {
QPushButton* btn = new QPushButton;
connect(btn, &QPushButton::clicked, this, &MainWindow::clear);
QString txt = "FINISH";
connect(btn, &QPushButton::clicked, [=](){
addbtn(txt);
});
ui->verticalLayout->addWidget(btn);
}
Added slot in MainWindow addBtn:
void MainWindow::addbtn(QString text)
{
QPushButton* btn = new QPushButton;
btn->setText(text);
ui->verticalLayout->addWidget(btn);
}
Running the program, buttons created, when i push the button all buttons removed (as it should be), but new button not created. Looks like this pat of the code not working:
connect(btn, &QPushButton::clicked, [=](){
addbtn(txt);
});
How to fix that?
try to set [&], also used txt, this{this->addbtn(txt}. If comment connect(btn, &QPushButton::clicked, this, &MainWindow::clear); new buttons created successfully.
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void clear();
void addbtn(QString text);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
for (int var = 0; var < 5; ++var) {
QPushButton* btn = new QPushButton;
connect(btn, &QPushButton::clicked, this, &MainWindow::clear);
QString txt = "FINISH";
connect(btn, &QPushButton::clicked, [=](){addbtn(txt);});
ui->verticalLayout->addWidget(btn);
}
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::clear()
{
QLayoutItem *child;
while ((child = ui->verticalLayout->takeAt(0)) != nullptr)
{
delete child->widget(); // delete the widget
delete child; // delete the layout item
}
}
void MainWindow::addbtn(QString text)
{
QPushButton* btn = new QPushButton;
btn->setText(text);
ui->verticalLayout->addWidget(btn);
}