在我的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()
}
这里&#34; List&#34;是我使用的相应QStringList!
当我按下按钮时调用createButtons()方法,如我的代码所示,按钮是动态创建的!
按钮显示qstringlist中的元素名称!每个元素都有一个方法名称!因此,当我单击一个按钮时,应该执行类似该方法名称的方法!
在此方案中,创建了2个按钮,显示&#34;运行&#34;&#34;停止&#34;。当我点击按钮显示&#34;运行&#34;我想执行上面定义的Run()方法!
我怎样才能实现它?
答案 0 :(得分:1)
一种可能的解决方案是使用QMetaObject::invokeMethod()
,但为此必须使用Run和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());
}