执行动态创建的按钮
Executing dynamically created buttons
在我的 qt c++ 应用程序中,我根据 QStringList 的内容动态创建按钮(即按钮的数量等于 QStringlist 中的元素数量,按钮的文本是列表中的元素)。
以下是我的代码
#include "dialog.h"
#include "ui_dialog.h"
#include "QFrame"
#include "QLabel"
#include "QPushButton"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::createButtons(){
List<<"Run"<<"Stop"";
for(int i=0;i<List.size();i++){
f1 = new QFrame();
a= new QPushButton();
a->setText(List[i]);
ui->horizontalLayout->addWidget(a);
}
}
void Dialog::Run(){
qDebug() << "You clicked on the Run button";
}
void Dialog::Stop(){
qDebug() << "You clicked on the Stop button";
}
void Dialog::on_pushButton_clicked()
{
createButtons()
}
这里"List"是我使用的各自的QStringList!
当我在单击按钮时调用 createButtons() 方法(如我的代码所示)时,按钮是动态创建的!
按钮正在显示 qstringlist 中的元素名称!每个元素都有一个方法名!所以当我点击一个按钮时,应该执行一个类似于该方法名称的方法!
在此场景中,创建了 2 个按钮,分别显示 "Run" 和 "Stop"。当我点击显示 "Run" 的按钮时,我想执行上面定义的 运行() 方法!
如何实现?
一个可能的解决方案是使用 QMetaObject::invokeMethod()
,但是为此 运行 和 Stop 函数必须是插槽:
private slots:
void on_pushButton_clicked();
// slots of button
void onClicked();
// your functions
void Run();
void Stop();
为此,我们将按钮连接到 onClicked 插槽:
void Dialog::createButtons()
{
List<<"Run"<<"Stop";
for(const QString &text : List ){
QPushButton* a= new QPushButton(this);
a->setText(text);
ui->horizontalLayout->addWidget(a);
connect(a, &QPushButton::clicked, this, &Dialog::onClicked);
}
}
然后通过 sender()
你得到发出信号的按钮,因此你得到文本:
void Dialog::onClicked()
{
QPushButton *b = qobject_cast<QPushButton *>(sender());
QMetaObject::invokeMethod(this, b->text().toLatin1().data());
}
完整的例子可以在下面link.
中找到
与 QSignalMapper
:
.h
private slots:
void on_pushButton_clicked();
void Run();
void Stop();
void onClicked(const QString &text);
private:
QSignalMapper *signalMapper;
.cpp
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
signalMapper = new QSignalMapper(this);
}
void Dialog::createButtons()
{
List<<"Run"<<"Stop";
for(const QString &text : List ){
QPushButton* a= new QPushButton(this);
a->setText(text);
ui->horizontalLayout->addWidget(a);
connect(a, &QAbstractButton::clicked, signalMapper, QOverload<>::of(&QSignalMapper::map));
signalMapper->setMapping(a, text);
}
connect(signalMapper, QOverload<const QString &>::of(&QSignalMapper::mapped), this, &Dialog::onClicked);
}
void Dialog::onClicked(const QString &text)
{
QMetaObject::invokeMethod(this, text.toLatin1().data());
}
在我的 qt c++ 应用程序中,我根据 QStringList 的内容动态创建按钮(即按钮的数量等于 QStringlist 中的元素数量,按钮的文本是列表中的元素)。
以下是我的代码
#include "dialog.h"
#include "ui_dialog.h"
#include "QFrame"
#include "QLabel"
#include "QPushButton"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::createButtons(){
List<<"Run"<<"Stop"";
for(int i=0;i<List.size();i++){
f1 = new QFrame();
a= new QPushButton();
a->setText(List[i]);
ui->horizontalLayout->addWidget(a);
}
}
void Dialog::Run(){
qDebug() << "You clicked on the Run button";
}
void Dialog::Stop(){
qDebug() << "You clicked on the Stop button";
}
void Dialog::on_pushButton_clicked()
{
createButtons()
}
这里"List"是我使用的各自的QStringList!
当我在单击按钮时调用 createButtons() 方法(如我的代码所示)时,按钮是动态创建的!
按钮正在显示 qstringlist 中的元素名称!每个元素都有一个方法名!所以当我点击一个按钮时,应该执行一个类似于该方法名称的方法!
在此场景中,创建了 2 个按钮,分别显示 "Run" 和 "Stop"。当我点击显示 "Run" 的按钮时,我想执行上面定义的 运行() 方法!
如何实现?
一个可能的解决方案是使用 QMetaObject::invokeMethod()
,但是为此 运行 和 Stop 函数必须是插槽:
private slots:
void on_pushButton_clicked();
// slots of button
void onClicked();
// your functions
void Run();
void Stop();
为此,我们将按钮连接到 onClicked 插槽:
void Dialog::createButtons()
{
List<<"Run"<<"Stop";
for(const QString &text : List ){
QPushButton* a= new QPushButton(this);
a->setText(text);
ui->horizontalLayout->addWidget(a);
connect(a, &QPushButton::clicked, this, &Dialog::onClicked);
}
}
然后通过 sender()
你得到发出信号的按钮,因此你得到文本:
void Dialog::onClicked()
{
QPushButton *b = qobject_cast<QPushButton *>(sender());
QMetaObject::invokeMethod(this, b->text().toLatin1().data());
}
完整的例子可以在下面link.
中找到与 QSignalMapper
:
.h
private slots:
void on_pushButton_clicked();
void Run();
void Stop();
void onClicked(const QString &text);
private:
QSignalMapper *signalMapper;
.cpp
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
signalMapper = new QSignalMapper(this);
}
void Dialog::createButtons()
{
List<<"Run"<<"Stop";
for(const QString &text : List ){
QPushButton* a= new QPushButton(this);
a->setText(text);
ui->horizontalLayout->addWidget(a);
connect(a, &QAbstractButton::clicked, signalMapper, QOverload<>::of(&QSignalMapper::map));
signalMapper->setMapping(a, text);
}
connect(signalMapper, QOverload<const QString &>::of(&QSignalMapper::mapped), this, &Dialog::onClicked);
}
void Dialog::onClicked(const QString &text)
{
QMetaObject::invokeMethod(this, text.toLatin1().data());
}