Выполнение динамически созданных кнопок

В моем приложении 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 (), определенный выше!

Как мне этого добиться?

0

Решение

Возможным решением является использование 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());
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]