Qt多个同类控件使用一个槽函数(两种方法)

本人对Qt也不是很熟,方法也是参考自网络,仅供参考

Qt的信号与槽机制,可以实现信号与槽的一对一、多对一和一对多,这里只讲多对一。

使用QSignalMapper类

QSignalMapper类可以绑定一组无参数的信号,并使用与发送信号的对象对应的整数、字符串或小部件参数重新发送这些信号。也就是说使用QSignalMapper管理的信号不能带参数(即使带了也用不了),且它能起到一个信号转发的作用。

mainwindow.c

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

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

    QSignalMapper *btMapper; //定义一个QsinalMapper类指针变量
    btMapper = new QSignalMapper;
    
    //定义一个按钮组件的指针数组,对应Designer设计器中放置的5个按钮
    QPushButton *bt[5] = {
    
    ui->pushButton, ui->pushButton_2, ui->pushButton_3,
                          ui->pushButton_4, ui->pushButton_5};
    for(int i = 0; i < 5; i++)
    {
    
    
        //将按钮的点击信号与btMapper的map()槽函数绑定,map()函数不需要我们实现
        connect(bt[i], SIGNAL(clicked(bool)), btMapper, SLOT(map()));
        //将i作为按钮信号触发时对应的参数值
        btMapper->setMapping(bt[i], i);
    }
    //将btMapper的mapped(int)信号与我们的按钮槽函数绑定,参数值为上面提到的i值
    connect(btMapper, SIGNAL(mapped(int)), this, SLOT(buttonSlot(int)));
}

//按钮槽函数,不同的按钮被按下打印不同的内容
void MainWindow::buttonSlot(int id)
{
    
    
    switch(id)
    {
    
    
        case 0: qDebug() << "按钮1"; break;
        case 1: qDebug() << "按钮2"; break;
        case 2: qDebug() << "按钮3"; break;
        case 3: qDebug() << "按钮4"; break;
        case 4: qDebug() << "按钮5"; break;
    }
}

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

mainwindow.h 头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

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

namespace Ui {
    
    
class MainWindow;
}

class MainWindow : public QMainWindow
{
    
    
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;

private slots:
    void buttonSlot(int id);
};

#endif // MAINWINDOW_H

运行效果

点击5个按钮,会打印按钮对应的编号信息:

在这里插入图片描述

使用sender()函数

sender()函数可以获取发送信号的对象指针,qobject_cast<QObject*>(sender());可以将发送信号的对象指针动态转换为QObject类的类型(如果是按钮对象,将QObject换成QPushButton即可)。

mainwindow.c

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

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

    //定义一个按钮组件的指针数组,对应Designer设计器中放置的5个按钮
    QPushButton *bt[5] = {
    
    ui->pushButton, ui->pushButton_2, ui->pushButton_3,
                          ui->pushButton_4, ui->pushButton_5};
    for(int i = 0; i < 5; i++)
    {
    
    
        //将bt[i]赋值给全局指针数组
        pPushButton[i] = bt[i];
        //将所有按钮的点击信号都与同一个按钮槽函数进行连接
        connect(bt[i], SIGNAL(clicked(bool)), this, SLOT(buttonSlot()));
    }
}

//按钮槽函数,不同的按钮被按下打印不同的内容
void MainWindow::buttonSlot(void)
{
    
    
    int i = 0;
    //将发送信号的指针转换为QPushButton类型
    QPushButton *pBt = qobject_cast<QPushButton *>(sender());

    //查找信号来源
    for(i = 0; i < 5; i++)
    {
    
    
        if(pPushButton[i] == pBt)
            break;
    }
    //打印按钮的编号及名字(编号为数组下标加1)
    qDebug() << "按钮" << i + 1 << ":" << sender()->objectName();
}


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

mainwindow.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();

private:
    Ui::MainWindow *ui;
    QPushButton *pPushButton[5];

private slots:
    void buttonSlot(void);

};

#endif // MAINWINDOW_H

运行效果

点击5个按钮,会打印按钮对应的编号和名字,

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43772810/article/details/124086502
今日推荐