如何动态添加 QPushButtons 到 UI
How to dynamically add QPushButtons to UI
仅供参考,我在 Linux Mint 上使用 Qt Creator 3.3.2。
好吧,首先我想承认我看到了一些与我要问的问题非常相似的问题......例如How to add a widget (QPushButton for example) dynamically to a layout built in designer。但是(无论出于何种原因)我在理解答案或实施答案方面都没有成功。我对 Qt 非常陌生,这是我的第一个项目,所以请完成,这样我才能理解答案。
到目前为止我有:
UI:
我有一个名为 srcFolderPairSelect 的滚动区域,在该区域下方(在 'object' window 中)我有一个名为 scrLayFolderPairSelect 的滚动内容。在不同的 section/area (不同的框架和布局)中,我有一个按钮,用于在单击时向前面提到的滚动内容添加一个按钮,名为 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 事件?
您可以这样操作,速度非常快:
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);
}
主要思想是存储 插槽(处理程序),然后,如果需要 - 存储按钮本身。
我的 "very fast" 解决方案是基于一个不好的实现方式。
你有很多方法来实现这个,但是,我认为最好的解决方案是创建 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);
}
仅供参考,我在 Linux Mint 上使用 Qt Creator 3.3.2。
好吧,首先我想承认我看到了一些与我要问的问题非常相似的问题......例如How to add a widget (QPushButton for example) dynamically to a layout built in designer。但是(无论出于何种原因)我在理解答案或实施答案方面都没有成功。我对 Qt 非常陌生,这是我的第一个项目,所以请完成,这样我才能理解答案。
到目前为止我有: UI: 我有一个名为 srcFolderPairSelect 的滚动区域,在该区域下方(在 'object' window 中)我有一个名为 scrLayFolderPairSelect 的滚动内容。在不同的 section/area (不同的框架和布局)中,我有一个按钮,用于在单击时向前面提到的滚动内容添加一个按钮,名为 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 事件?
您可以这样操作,速度非常快:
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);
}
主要思想是存储 插槽(处理程序),然后,如果需要 - 存储按钮本身。
我的 "very fast" 解决方案是基于一个不好的实现方式。
你有很多方法来实现这个,但是,我认为最好的解决方案是创建 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);
}