如何连接动态添加按钮的Qt信号和插槽以获取添加按钮的插槽索引?

问题描述 投票:1回答:2

我有QPushButton指针列表:

QList<QPushButton*> listButtons;

在这段代码中,我添加了动态按钮

listButtons.push_back(new QPushButton("Cancel", this)); 
connect(listButtons.last(), SIGNAL (clicked(listButtons.size)), this, SLOT(handleButton(int))); //this doesn't work

如何保存每个按钮的索引,这样我就可以跟踪用户点击的按钮,因为每个按钮都必须取消特定的任务。

我使用C ++ 98,所以我不能使用Lambda函数

c++ qt button qt-signals slot
2个回答
1
投票

你必须在你的插槽中使用sender()功能。像这样:

void MainWindow::buttonClicked()
{
    QObject *senderObj = sender(); // This will give Sender object
    QString senderObjName = senderObj->objectName();
    qDebug()<< "Button: " << senderObjName;
}

查看我为您制作的完整示例。 (Screenshot

.cpp文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    for(int i =0; i<10; i++)
    {
        listButtons.push_back(createNewButton());
        connect(listButtons[i], &QPushButton::clicked, this, &MainWindow::buttonClicked);
        QString text = listButtons[i]->text();

        ui->widget->layout()->addWidget(listButtons[i]);
    }
}


MainWindow::~MainWindow()
{
    delete ui;
}

QPushButton* MainWindow::createNewButton()
{
    QPushButton* button = new QPushButton("ButtonText");
    button->setObjectName("ButtonName");
    return button;
}

void MainWindow::buttonClicked()
{
    QObject *senderObj = sender(); // This will give Sender object
    QString senderObjName = senderObj->objectName();
    qDebug()<< "Button: " << senderObjName;
}

.h文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include <QPushButton>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    QList<QPushButton*> listButtons;

    QPushButton *createNewButton();
    void buttonClicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

更多信息:

sender()函数返回指向发送信号的对象的指针,如果在由信号激活的插槽中调用的话;否则它返回0.指针仅在执行从该对象的线程上下文调用此函数的槽期间有效。

警告:此功能违反了面向对象的模块化原则。但是,当许多信号连接到单个插槽时,访问发送器可能很有用。


0
投票

一种简单的方法是捕获连接到信号的lambda中的索引(或任何想要传递给插槽的内容),然后将该信号传递给插槽。

一般的想法是这样的:

auto button = new QPushButton("Cancel", this);
auto index = /* code to get what you want to pass */ ;
connect(button, &QPushButton::clicked,
    this, [index, this](bool){ this->handleButton(index); });
© www.soinside.com 2019 - 2024. All rights reserved.