/**************************************************************************************
* 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. mysql-5.7中的innodb_buffer_pool_prefetching(read-ahead)详解

    一.innodb的read-ahead是什么: 所谓的read-ahead就是innodb根据你现在访问的数据,推测出你接下来可能要访问的数据,并把它们(可能要访问的数据)读入 内存. 二.read- ...

  2. 赶集mysql军规

    总是在灾难发生后,才想起容灾的重要性.总是在吃过亏后,才记得曾经有人提醒过. 一,核心军规 不在数据库做计算,cpu计算务必移至业务层 控制单表数据量,单表记录控制在千万级 控制列数量,字段数控制在2 ...

  3. cocos2dx当节点存在缩放时要注意的问题

    cocos2dx(所有引擎也均如此),如果一个节点存在缩放,一定不要忘了其局部空间里的单位长度也会发生变化.其子节点位移,局部空间转世界空间结果等都会受影响. 有时候我们想将父节点的缩放转移到子节点中 ...

  4. ps减去图层混合模式

    ps减去图层混合模式 CMYK 1.1.青色作为基色,品红作为混合色(减去混合模式) 红反即青色(绿色+蓝色) - 绿反即品红色(红色+蓝色)= 绿色   公式简化: 绿色 + 蓝色 - 红色 - 蓝 ...

  5. excel错误:外部表不是预期的格式 错误

    环境:win7+iis7+Office2007 在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一 ...

  6. php四种排序算法实现代码

    分享php排序的四种算法与代码. 冒泡:function bubble_sort($arr){ $num = count($arr); for($i=0;$i<$num;$i++){ for($ ...

  7. 又发现一个visual studio 2015的坑啊。

    又发现一个visual studio 2015的坑啊...我的后台管理的目录名称叫@duck, 但是在新版VS2015中打开项目后编译,出现错误: Error opening response fil ...

  8. [svc]linux bridge&docker0&k8s pod网络模型通俗演义

    linux namespace&bridge通俗演义 linux接口类型 br0 eth0: 一个接口 veth : 一对接口,类似一跟网线,一头有地址,另一头连到别处, linux 2个na ...

  9. Django视图之视图函数

    下面来说说常见的视图函数: HttpResponse() Http404() HttpResponseNotFound() 上面三个函数功能比较简单,用得少,就不多说了! render() rende ...

  10. 四、用“”或构造函数创建Java的String区别

    在Java中,一个字符串可以通过下面两种方法创建. String x = "abc"; String y = new String("abc"); 用双引号创建 ...