最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

QT QPushButton clicked & lambda connect - Stack Overflow

programmeradmin2浏览0评论

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);
}
发布评论

评论列表(0)

  1. 暂无评论