(如果对您有帮助记得点赞哦)
最近在项目需要操作单片机IO,需要很多个按钮,每个按钮的功能基本相同。使用QT设计师创建按钮的需要每个按钮单独写槽函数,非常不方便。因此用到了**QSignalMapper**。
简介
QSignalMapper是一个将已知发射对象和信号绑定在一起的类。通过看帮助文档中的内容,其主要的作用是将一个无参信号绑定一个参数,然后再将这个信号加上这个参数转发出去。
槽函数map
void map(QObject *sender)
void map()
带参数的这个map函数,是会发射sender这个对象所映射的信号。而不带参数的这个map函数会根据槽函数所连接的信号,来发射对应的带参数的信号
main.c代码
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->setGeometry(0, 0, 800, 480);
//容器widge
gWidget = new QWidget(this);
//widget主显
this->setCentralWidget(gWidget);
//布局
gridLayout = new QGridLayout();
//标签 显示当前按下的按钮
lable = new QLabel();
//QsinalMapper类指针变量
btMapper = new QSignalMapper;
//行数 整体布局为 5*6
int row = 0;
for (int col = 0; col<30; col++)
{
btn[col] = new QPushButton(("btn " + QString::number(col+1)), this);
//布局 5*6
if((col+1)%5 )
{
gridLayout->addWidget(btn[col] ,row, (col - row*5),1 ,1);
}else
{
gridLayout->addWidget(btn[col] ,row, (col - row*5),1 ,1);
row++;
}
//QsinalMapper 关联信号 并赋值
btMapper->setMapping(btn[col], col+1);
connect(btn[col], SIGNAL(clicked()), btMapper, SLOT(map()));
}
//标签字体设置
QFont font;
font.setFamily(QString::fromUtf8("Agency FB"));
font.setPointSize(20);
font.setBold(true);
font.setWeight(75);
lable->setFont(font);
//lable位置
gridLayout->addWidget(lable ,++row, 0 ,1 ,1);
//链接槽
connect(btMapper, SIGNAL(mapped(int)), this, SLOT(btn_Clicked(int)));
gWidget->setLayout(gridLayout);
}
MainWindow::~MainWindow()
{
}
/* 槽函数的实现 */
void MainWindow::btn_Clicked(int id)
{
lable->setText("按钮 "+QString::number(id) + " 按下");
}
main.h代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include <QGridLayout>
#include <QLabel>
#include <QSignalMapper>
#include <QDebug>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
QWidget *gWidget;
QGridLayout *gridLayout;
QSignalMapper *btMapper;
QPushButton *btn[30];
QLabel *lable;
private slots:
void btn_Clicked( int id);
};
#endif // MAINWINDOW_H