1. /**************************************************************************************
  2. * QT QSignalMapper
  3. *
  4. * QSignalMapper可以看做是一个信号的转发类。将多个信号作为一个集合,当接受到信号之后,
  5. * 将信号转发出去,并且可以更改发送出去信号参数类型。进行映射之后,接受到信号将会发给
  6. * map()函数,而map()函数又会发送mapped()信号。
  7. * Button是qt中常用到的控件,当使用多个Button时,如果每一个button都对应一个slot函数,
  8. * 就会显得很多余,使用QSignalMapper类就能避免这种情况,提高不少效率。
  9. * 参考:  
  10. * http://doc.qt.io/qt-4.8/qsignalmapper.html#setMapping
  11. *   http://blog.csdn.net/cuteqt/article/details/4306900
  12. *
  13. * Tony Liu, 2016-5-20, Shenzhen
  14. **************************************************************************************/
  15. . 首先分析参考链接中,QT官网的例子。
  16. class ButtonWidget : public QWidget
  17. {
  18. Q_OBJECT
  19.  
  20. public:
  21. ButtonWidget(QStringList texts, QWidget *parent = );
  22.  
  23. slots:
  24. void doclicked(const QString &text);
  25.  
  26. private:
  27. QSignalMapper *signalMapper;
  28. };
  29.  
  30. ButtonWidget::ButtonWidget(QStringList texts, QWidget *parent)
  31. : QWidget(parent)
  32. {
  33. signalMapper = new QSignalMapper(this);
  34.  
  35. QGridLayout *gridLayout = new QGridLayout;
  36. for (int i = ; i < texts.size(); ++i) {
  37. QPushButton *button = new QPushButton(texts[i]);
  38.  
  39.      //将信号发送给signalMapper对象的map()函数
  40. connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
  41.  
  42. //进行映射,表示当button发送信号给map()函数,map()函数将会发出mapped(texts[i])信号,将texts[i]作为参数
  43.      signalMapper->setMapping(button, texts[i]);
  44. gridLayout->addWidget(button, i / , i % );
  45. }
  46.    //发出的mapped()函数,由doclicked()函数接收
  47. connect(signalMapper, SIGNAL(mapped(const QString &)),
  48. this, SLOT(doclicked(const QString &)));
  49.  
  50. setLayout(gridLayout);
  51. }
  52.  
  53. .自己实现
  54. class MainWindow : public QMainWindow
  55. {
  56. Q_OBJECT
  57.  
  58. public:
  59. explicit MainWindow(QWidget *parent = );
  60. ~MainWindow();
  61.  
  62. private slots:
  63. void buttonClicked(QWidget *w);
  64.  
  65. private:
  66. Ui::MainWindow *ui;
  67.  
  68. QSignalMapper signalMapper;
  69. };
  70.  
  71. MainWindow::MainWindow(QWidget *parent) :
  72. QMainWindow(parent),
  73. ui(new Ui::MainWindow)
  74. {
  75. ui->setupUi(this);
  76.  
  77. signalMapper.setMapping(ui->pushButton_O_1, ui->pushButton_O_1);
  78. signalMapper.setMapping(ui->pushButton_O_2, ui->pushButton_O_2);
  79. signalMapper.setMapping(ui->pushButton_O_3, ui->pushButton_O_3);
  80. signalMapper.setMapping(ui->pushButton_O_4, ui->pushButton_O_4);
  81. signalMapper.setMapping(ui->pushButton_O_5, ui->pushButton_O_5);
  82. signalMapper.setMapping(ui->pushButton_O_6, ui->pushButton_O_6);
  83. signalMapper.setMapping(ui->pushButton_O_7, ui->pushButton_O_7);
  84. signalMapper.setMapping(ui->pushButton_O_8, ui->pushButton_O_8);
  85. signalMapper.setMapping(ui->pushButton_O_9, ui->pushButton_O_9);
  86.  
  87. connect(ui->pushButton_O_1, SIGNAL(clicked()), &signalMapper, SLOT(map()));
  88. connect(ui->pushButton_O_2, SIGNAL(clicked()), &signalMapper, SLOT(map()));
  89. connect(ui->pushButton_O_3, SIGNAL(clicked()), &signalMapper, SLOT(map()));
  90. connect(ui->pushButton_O_4, SIGNAL(clicked()), &signalMapper, SLOT(map()));
  91. connect(ui->pushButton_O_5, SIGNAL(clicked()), &signalMapper, SLOT(map()));
  92. connect(ui->pushButton_O_6, SIGNAL(clicked()), &signalMapper, SLOT(map()));
  93. connect(ui->pushButton_O_7, SIGNAL(clicked()), &signalMapper, SLOT(map()));
  94. connect(ui->pushButton_O_8, SIGNAL(clicked()), &signalMapper, SLOT(map()));
  95. connect(ui->pushButton_O_9, SIGNAL(clicked()), &signalMapper, SLOT(map()));
  96. //发送的参数只能使QString和QWidget,QObject等,而QPushButton继承了QWidget
  97. connect(&signalMapper, SIGNAL(mapped(QWidget *)), this, SLOT(buttonClicked(QWidget *)));
  98. /* 给Button设置一个属性,并给属性添加值,如果一个按键带有多个参数的时候,
  99. * 设置属性是个不错的方法,可以设置多个属性
  100. */
  101. ui->pushButton_O_1->setProperty("gpio", );
  102. ui->pushButton_O_2->setProperty("gpio", );
  103. ui->pushButton_O_3->setProperty("gpio", );
  104. ui->pushButton_O_4->setProperty("gpio", );
  105. ui->pushButton_O_5->setProperty("gpio", );
  106. ui->pushButton_O_6->setProperty("gpio", );
  107. ui->pushButton_O_7->setProperty("gpio", );
  108. ui->pushButton_O_8->setProperty("gpio", );
  109. ui->pushButton_O_9->setProperty("gpio", );
  110.  
  111. }
  112.  
  113. MainWindow::~MainWindow()
  114. {
  115. ::close(gpio_fd);
  116. delete ui;
  117. }
  118.  
  119. void MainWindow::buttonClicked(QWidget *w)
  120. {
  121. //获取属性,传入的参数使qvariant类型的,需要转化为int类型
  122. int gpioIndex = qvariant_cast<int>(w->property("gpio"));
  123. QString str = QString::number(gpioIndex, );
  124. //由于传入的参数使QWidget,如果要设置按键,需要转为QPushButton,才能操作button
  125. QString ioState = ((QPushButton *)w)->text();
  126. }

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. Okhttp常用方法示例

    这是我用到的一个util类 public class HttpBaseService { private OkHttpClient client = new OkHttpClient(); priva ...

  2. JAVA命令行编译及运行

    第一部分:单文件 一.背景目标文件HelloWorld.java package ccdate; public class HelloWorld { public static void main(S ...

  3. C# 查看动态库的方法

    使用Vs自带工具:开始菜单-->Microsoft Visual Studio 2010--> Visual Studio Tools-->Visual Studio 命令提示符 输 ...

  4. Spring事务管理实现方式之编程式事务与声明式事务详解(转)

    原文:https://blog.csdn.net/liaohaojian/article/details/70139151 编程式事务 编码方式实现事务管理(代码演示为JDBC事务管理) Spring ...

  5. iOS学习笔记37-时间和日期计算

    一.时间和日期计算 我们在应用开发中,时常须要和时间打交道,比方获取当前时间,获取两个时间点相隔的时间等等,在iOS开发中与时间相关的类有例如以下几个: 1. NSDate:表示一个绝对的时间点 2. ...

  6. Ubuntu和centos下查看包的安装路径

    安装包后,如何查看安装的具体路径? Ubuntu下: dpkg -L  <包名> CentOS下: rpm -ql   <包名> 助记: l为list的首字母. q为query ...

  7. 特效effects

    Test中使用的特效如下 首先,使用ccg(x,y)建grid,一个Grid 属性就好像一个矩阵,是一个网络的线,组成一系列的方块和矩阵. 一个(16,12)大小的grid将会运行的非常快,但是并不会 ...

  8. angular学习笔记(九)-css类和样式2

    在上一个例子中,元素的类名使用拼接的方法,这样,类名中就不得不带有true或false,并且不易维护,所以,angular使用ng-class属性来控制元素的类名: 我们来看一个小例子,点击error ...

  9. Win7  CMD大全

    Win7  CMD大全  compmgmt.msc---计算机管理 conf—-启动 netmeeting charmap–-启动字符映射表 calc—-启动计算器 chkdsk.exe–-Chkds ...

  10. NSIS安装程序制作工具判断系统是否安装.NET

    前段时间忙了很久的系统总算上线了,由于是WinForm程序不能整个文件夹的发给客户使用.所以必须要打包,记得以前在VS2005中是自带部署功能的.现在换了VS2013那个部署功能完全弄不清方向.最后在 ...