В моем приложении 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 (), определенный выше!
Как мне этого добиться?
Возможным решением является использование 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());
}
Полный пример можно найти в следующем ссылка на сайт.
с QSignalMapper
:
.час
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());
}
Других решений пока нет …