c++ - 执行动态创建的按钮

标签 c++ qt qt5 qpushbutton qt-slot

在我的 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”的按钮时,我想执行上面定义的 Run() 方法!

我怎样才能实现它?

最佳答案

一个可能的解决方案是使用QMetaObject::invokeMethod(),但是为此,运行和停止函数必须是槽:

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());
}

关于c++ - 执行动态创建的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47625754/

相关文章:

c++ - 为什么我的重载 + 运算符在返回时会产生 "Invalid address specified to RtlValidateHeap"错误?

qt - Object::connect:没有这样的槽 AllWidgets::m_pSpinBoxOut->setText

qt - 对 QTableWidget 的垂直标题进行排序

python - PyQt5 - 如何将关闭键(红色 x)连接到函数

c++ - qt5结合QGroupBox和QPushButton

c++ - extern const inside namespace 和 static const 类成员之间的区别?

c++ - void QTableWidget::setItemPrototype ( const QTableWidgetItem * item ) 如何克隆对象?

c++ - Shiboken2 和自定义 Qt 小部件

c++ - C++ 中构造函数可能存在歧义

c++ - 如何将 Qt 中的某些内容标记为过时(已弃用)?