本人对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个按钮,会打印按钮对应的编号和名字,