如何动态地将QPushButtons添加到UI

时间:2015-07-30 17:41:43

标签: c++ qt qt-creator

仅供参考我在Linux Mint上使用Qt Creator 3.3.2。

首先,我想承认我已经看到了一些与我要求的问题非常相似的问题......例如How to add a widget (QPushButton for example) dynamically to a layout built in designer。然而(无论出于何种原因)我在理解答案或实施答案方面都没有成功。我是Qt的新手,这是我的第一个项目,所以请通过,以便我能理解答案。

到目前为止我所拥有的: 用户界面: 我有一个名为srcFolderPairSelect的滚动区域,在它下面(在'对象'窗口中)我有一个名为scrLayFolderPairSelect的滚动内容。在不同的部分/区域(不同的框架和布局)中,我有一个按钮,用于在前面提到的滚动内容中添加一个按钮,名为btnAddNewFolderPair,点击后。 PS:我需要它能够被多次点击(需要能够在滚动内容中添加多个动态按钮)。

标题文件:

#ifndef SYNCCENTER_H
#define SYNCCENTER_H

#include <QMainWindow>

namespace Ui {
    class SyncCenter;
}

class SyncCenter : public QMainWindow
{
    Q_OBJECT

public:
    explicit SyncCenter(QWidget *parent = 0);
    ~SyncCenter();

private slots:
    void on_btnAddFolderPair_clicked();

private:
    Ui::SyncCenter *ui;
};

#endif // SYNCCENTER_H

UI cpp(synccenter.cpp):

#include "synccenter.h"
#include "ui_synccenter.h"

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

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

void SyncCenter::on_btnAddFolderPair_clicked()
{
    QPushButton* button = new QPushButton("test");
    button->setVisible(true);
    ui->scrLayFolderPairSelect->layout()->addWidget(button);
}

另外,我如何为动态按钮形成onclick事件?

1 个答案:

答案 0 :(得分:4)

以非常快的方式你可以这样做:

void SyncCenter::on_btnAddFolderPair_clicked()
{
    static int count{};
    QPushButton* button = new QPushButton(QString("test %1").arg(++count), this);
    button->setVisible(true);
    connect(button, &QPushButton::clicked, [&count](){
        std::cout << "Clicked button number: " << count << std::endl;
    });
    ui->scrLayFolderPairSelect->layout()->addWidget(button);
}

主要想法是存储广告位(处理程序),然后,如果您需要 - 存储按钮本身。

这个我的“非常快”的解决方案是基于不是实现这一目标的好方法。

你有很多方法可以实现这一点,但是,我认为,最好的解决方案是创建QButtonGroup因为它有如下信号:

void buttonClicked(QAbstractButton *button);
void buttonClicked(int id);

所以,你的代码就像:

class SyncCenter {
    //....
private slots:
    void buttonInGroupClicked(QAbstractButton *);

private:    
    QButtonGroup *buttonGroup;
};

SyncCenter::SyncCenter(/*...*/) {
    buttonGroup = new QButtonGroup(this);
    connect(buttonGroup, SIGNAL(buttonClicked(QAbstractButton*)), SLOT(buttonInGroupClicked(QAbstractButton*)));
}

void SyncCenter::buttonInGroupClicked(QAbstractButton *b) {
    // do anything with your button
}

void SyncCenter::on_btnAddFolderPair_clicked()
{
    static int count{};
    QPushButton* button = new QPushButton(QString("test %1").arg(++count), this);
    button->setVisible(true);
    buttonGroup->addButton(button);
    ui->scrLayFolderPairSelect->layout()->addWidget(button);
}