/**************************************************************************************
* QT QSignalMapper
*
* QSignalMapper可以看做是一个信号的转发类。将多个信号作为一个集合,当接受到信号之后,
* 将信号转发出去,并且可以更改发送出去信号参数类型。进行映射之后,接受到信号将会发给
* map()函数,而map()函数又会发送mapped()信号。
* Button是qt中常用到的控件,当使用多个Button时,如果每一个button都对应一个slot函数,
* 就会显得很多余,使用QSignalMapper类就能避免这种情况,提高不少效率。
* 参考:  
* http://doc.qt.io/qt-4.8/qsignalmapper.html#setMapping
*   http://blog.csdn.net/cuteqt/article/details/4306900
*
* Tony Liu, 2016-5-20, Shenzhen
**************************************************************************************/
. 首先分析参考链接中,QT官网的例子。
class ButtonWidget : public QWidget
{
Q_OBJECT public:
ButtonWidget(QStringList texts, QWidget *parent = ); slots:
void doclicked(const QString &text); private:
QSignalMapper *signalMapper;
}; ButtonWidget::ButtonWidget(QStringList texts, QWidget *parent)
: QWidget(parent)
{
signalMapper = new QSignalMapper(this); QGridLayout *gridLayout = new QGridLayout;
for (int i = ; i < texts.size(); ++i) {
QPushButton *button = new QPushButton(texts[i]);      //将信号发送给signalMapper对象的map()函数
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map())); //进行映射,表示当button发送信号给map()函数,map()函数将会发出mapped(texts[i])信号,将texts[i]作为参数
     signalMapper->setMapping(button, texts[i]);
gridLayout->addWidget(button, i / , i % );
}
   //发出的mapped()函数,由doclicked()函数接收
connect(signalMapper, SIGNAL(mapped(const QString &)),
this, SLOT(doclicked(const QString &))); setLayout(gridLayout);
} .自己实现
class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = );
~MainWindow(); private slots:
void buttonClicked(QWidget *w); private:
Ui::MainWindow *ui; QSignalMapper signalMapper;
}; MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); signalMapper.setMapping(ui->pushButton_O_1, ui->pushButton_O_1);
signalMapper.setMapping(ui->pushButton_O_2, ui->pushButton_O_2);
signalMapper.setMapping(ui->pushButton_O_3, ui->pushButton_O_3);
signalMapper.setMapping(ui->pushButton_O_4, ui->pushButton_O_4);
signalMapper.setMapping(ui->pushButton_O_5, ui->pushButton_O_5);
signalMapper.setMapping(ui->pushButton_O_6, ui->pushButton_O_6);
signalMapper.setMapping(ui->pushButton_O_7, ui->pushButton_O_7);
signalMapper.setMapping(ui->pushButton_O_8, ui->pushButton_O_8);
signalMapper.setMapping(ui->pushButton_O_9, ui->pushButton_O_9); connect(ui->pushButton_O_1, SIGNAL(clicked()), &signalMapper, SLOT(map()));
connect(ui->pushButton_O_2, SIGNAL(clicked()), &signalMapper, SLOT(map()));
connect(ui->pushButton_O_3, SIGNAL(clicked()), &signalMapper, SLOT(map()));
connect(ui->pushButton_O_4, SIGNAL(clicked()), &signalMapper, SLOT(map()));
connect(ui->pushButton_O_5, SIGNAL(clicked()), &signalMapper, SLOT(map()));
connect(ui->pushButton_O_6, SIGNAL(clicked()), &signalMapper, SLOT(map()));
connect(ui->pushButton_O_7, SIGNAL(clicked()), &signalMapper, SLOT(map()));
connect(ui->pushButton_O_8, SIGNAL(clicked()), &signalMapper, SLOT(map()));
connect(ui->pushButton_O_9, SIGNAL(clicked()), &signalMapper, SLOT(map()));
//发送的参数只能使QString和QWidget,QObject等,而QPushButton继承了QWidget
connect(&signalMapper, SIGNAL(mapped(QWidget *)), this, SLOT(buttonClicked(QWidget *)));
/* 给Button设置一个属性,并给属性添加值,如果一个按键带有多个参数的时候,
* 设置属性是个不错的方法,可以设置多个属性
*/
ui->pushButton_O_1->setProperty("gpio", );
ui->pushButton_O_2->setProperty("gpio", );
ui->pushButton_O_3->setProperty("gpio", );
ui->pushButton_O_4->setProperty("gpio", );
ui->pushButton_O_5->setProperty("gpio", );
ui->pushButton_O_6->setProperty("gpio", );
ui->pushButton_O_7->setProperty("gpio", );
ui->pushButton_O_8->setProperty("gpio", );
ui->pushButton_O_9->setProperty("gpio", ); } MainWindow::~MainWindow()
{
::close(gpio_fd);
delete ui;
} void MainWindow::buttonClicked(QWidget *w)
{
//获取属性,传入的参数使qvariant类型的,需要转化为int类型
int gpioIndex = qvariant_cast<int>(w->property("gpio"));
QString str = QString::number(gpioIndex, );
//由于传入的参数使QWidget,如果要设置按键,需要转为QPushButton,才能操作button
QString ioState = ((QPushButton *)w)->text();
}

QSignalMapper Class的更多相关文章

  1. QSignalMapper类处理多信号关联同一个槽的方法(2)

    例1: QSignMapper *mapper = new QSignMapper(this) QPushButton *btn1 = new QPushButton(this); btn1-> ...

  2. QSignalMapper类处理多信号关联同一个槽的方法(1)

    QSignalMapper这个类并不是个新鲜概念, 早在Qt2里就已经存在, 而且它的功能也是始终如一. 不过由于宣传力度不够(例子里涉及到它的很少)了解这个类人可能还不是很多, 所以特此撰文介绍此类 ...

  3. QSignalMapper类的使用

    Qt中当定义了非常多的button,而他们的信号都同样时(比方都是点击信号),没有必要给他们每一个都设置信号和槽的链接.QSignalMapper给我们攻克了这个难题. 今天完毕这个相似的功能时,不知 ...

  4. QT 巧用QSignalMapper分类有序地处理大量信号

    转自--> http://blog.csdn.net/cuteqt/article/details/4306900 QSignalMapper这个类并不是个新鲜概念, 早在Qt2里就已经存在, ...

  5. QT之QSignalMapper(可以理解为转发器,多个按钮绑定到一个Edit上,且能分辨。每个单独连接的话,反而麻烦)

    QT之QSignalMapper QT之QSignalMapper 简述 效果图 上代码 相关知识点文章 结尾 简述 QSignalMapper我们可以理解为转发器,此话怎讲呢?比如,按钮点击的响应槽 ...

  6. 【QT开发】信号转发器QSignalMapper的使用

    QSignalMapper我们可以将它理解为一个信号翻译器或者说是哥信号转发器.它的主要应用在于可以实现一个函数相应不同按钮的实现功能.比如我们 实现一个计算器的时候,很多不同的按钮都有着差不多的功能 ...

  7. QSignalMapper is deprecated

    今天参考 qt4 的书籍,在 qt5 的平台上面,用了 QSignalMapper,结果收到警告" QSignalMapper is deprecated". 经过一番查找,找到了 ...

  8. QSignalMapper的使用和使用场景

    目录 QSignalMapper的使用和使用场景 常见场景 下面是参考.可看可不看 这篇写的不错,搬运为Markdown了 可以看一下 参考 QSignalMapper的使用和使用场景 QSignal ...

  9. Qt5中的信号槽

    Qt4中的信号槽 Qt4中的信号槽是通过SIGNAL,SLOT两个宏,将参数转换成字符串.Qt编译前,会从源码的头文件中提取由signal和slot声明的信号和槽的函数, 将其组成一张信号和槽对应的字 ...

随机推荐

  1. Unity3d的lodgroup调节

    才发现,假设不惬意LodGroup的百分比调节,能够在通过质量->中的Lod Bias值进行调节. 值为0-1之间 ,表示靠近精细与粗糙Lod的比率. 这样能解决用百分比调节不给力的问题.

  2. Win7没有telnet怎么办

    http://jingyan.baidu.com/article/8065f87fc3b31123312498e5.html

  3. 《Effective Java》读书笔记一(创建与销毁对象)

    No1 考虑用静态工厂方法代替构造器 静态工厂方法优势: 它们有名称,阅读性增强,如:BigInteger.probablePrime: 不必每次调用它们的时候都创建一个新对象: 它们可以返回原返回类 ...

  4. openvpn上查看谁在连接服务端

    在服务端/etc/openvpn目录里面有ipp.txt和openvpn-status.log,这两个文件里面记录了,访问服务器的ip网段和地址.但是这两个文件也不是专门干这个用的,也算是一种另类的用 ...

  5. Let's call it a "return"

    Preface Long time no see. For some reason that I failed to keep updating this blog, which is really ...

  6. maven(3)------maven构建web项目详细步骤

    eclipse集成工具,轻松通过maven构建web项目步骤如下: 一, 右键,new -->project, 进入下一页面 二,选择"Maven Project", 点击下 ...

  7. js需要学习的

    1.js作用域 2.html5和css3 3.js面向对象 4.js原生ajax 5.js与后端交互 6.html5手机移动端页面练习 7.jquery中的jQuery UI框架和jQuery Eas ...

  8. R 画structure图

    id percent  k1_B04_WL-1.fs_1   0.021 k31_B04_WL-1.fs_1   0.624 k21_B04_WL-1.fs_1   0.355 k1 K=3  数据输 ...

  9. redis、mysql、和php原生array数组效率对比

    最近要做一个屏蔽词的功能,屏蔽词是保存在配置文件里,最开始是用php数组存储,然后查找. 后来随着屏蔽词的增多,速度明显的变慢了,于是考虑到用redis或mysql做. 于是写了一个测试,测试结果如下 ...

  10. 自定义maven变量以及maven内置常量

    本文转自:http://zheng12tian.iteye.com/blog/1770909 在创建Maven工程后,插件配置中通常会用到一些Maven变量,因此需要找个地方对这些变量进行统一定义,下 ...