QT SignalMapper(信号映射器)

原创 2017年05月04日 09:08:41

QT中通过信号/槽机制,将信号与槽函数关联。有时候希望获得信号发送者信息,QT提供了QObject::sender()函数来返回发送该信号的对象的指针。但是如果有多个信号关联到了同一个槽上,而在该槽中需要对每一个信号进行不同的处理,使用上面的方法就很麻烦了。对于这种情况,便可以使用QSignalMapper类。QSignalMapper可以叫做信号映射器,可以实现对多个相同部件的相同信号进行映射,为其添加字符串或者数值参数,然后再发射出去。
示例如下:

mainwidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QSignalMapper>
class MainWidget : public QWidget
{
   Q_OBJECT 
//槽函数
private slots: 
    //处理最终信号的槽
    void doClicked(const QString & btnname);
private:
   QSignalMapper *signalMapper;
public:
   MainWidget(QWidget *parent = 0);
};
#endif // MAINWIDGET_H  

mainwidget.cpp

#include <QGridLayout>
#include <QPushButton>
#include <QMessageBox>
#include "mainwidget.h"
void MainWidget::doClicked(const QString &btnname)
{
   //显示被按下的btn名称。 
   QMessageBox::information(this, "Clicked", btnname + " is clicked!");
}
MainWidget::MainWidget(QWidget *parent) : QWidget(parent)
{
   //10个button 
   QString buttontext = "btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn10"; 
   QStringList texts = buttontext.split(","); 
   signalMapper = new QSignalMapper(this); 
   QGridLayout *gridLayout = new QGridLayout; 
   for (int i = 0; i < texts.size(); ++i) 
   {
      QPushButton *button = new QPushButton(texts[i], this); 
      button->setObjectName(texts[i]); 
      //原始信号传递给signalmapper 
      connect(button, SIGNAL(clicked()), signalMapper, SLOT(map())); 
      signalMapper->setMapping(button, texts[i]); 
      //设置signalmapper的转发规则, 转发为参数为QString类型的信号, 并把texts[i]的内容作为实参传递。 
      gridLayout->addWidget(button, i / 3, i % 3); 
   }
   //将转发的信号连接到最终的槽函数
   connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(doClicked(const QString &))); 
   setLayout(gridLayout);
}

main.cpp

#include "mainwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{ 
   QApplication a(argc, argv); 
   MainWidget w;
   w.show(); 
   return a.exec();
}
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/jianggujin/article/details/71157880

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

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

Qt SignalMapper 使用实例

  • 2014年09月23日 15:07
  • 314KB
  • 下载

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

此外,在C:\Qt\4.8.4\examples\tools\inputpanel此例中也用到了信号映射器。 再有一个例子: QSignMapper *mapper = n...
  • zzwdkxx
  • zzwdkxx
  • 2014-06-04 18:25:14
  • 2701

Qt5 中的 signal/slot 新语法

Qt 5 Alpha 已经发布。我们会在后面的文章中看到 Qt 5 的新变化。今天,我们先来看一下 Qt 5 带来的一个最主要的变化:signal/slot 机制的改变。 Qt 5 之前的语法 ...
  • hemmingway
  • hemmingway
  • 2015-12-25 13:38:47
  • 2337

QT核心:signal-slot 信号/槽机制 最详细最通俗易懂的一篇

原创翻译:信号&槽(QT 基础) crystalblue,sand.fj.wen翻译 cxt_programmer校正 2010-10-22 14:55| 发布者: Vincent| 查看: 1...
  • zkl99999
  • zkl99999
  • 2016-12-21 16:51:10
  • 5275

QT——QSignalMapper

QSignalMapper类通过自定义信号发送者la class bundles signals from identifiable senders. This class collects...
  • u012627502
  • u012627502
  • 2014-05-25 13:39:31
  • 1854

QT:有序排放多个按钮并处理它们的信号

像QQ的好友列表那样排列多个按钮是一项很不错的技术,使用QToolBox可以简单地实现这个需求,而运用QT的QSignalMapper类又可以方便地处理大量由不同控件发出的信号,以下是基于这两技术的一...
  • AAA20090987
  • AAA20090987
  • 2012-01-05 21:05:15
  • 5229

QSignalMapper

在QT编程中,如果遇到多个控件,但是他们的槽大致相同,这个该怎么处理,比如10个button,难道要写10个槽,可以不必这样,QSignalMapper可以帮组我们解决。 ...
  • mcgrady_tracy
  • mcgrady_tracy
  • 2011-11-21 16:28:29
  • 7897

QSignalMapper的使用

QSignalMapper的使用 1. 可以吧无参数的信号
  • lpmygod
  • lpmygod
  • 2014-10-26 16:36:16
  • 4460

QSignalMapper类的使用

Qt中当定义了很多的按钮,而他们的信号都相同时(比如都是点击信号),没有必要给他们每个都设置信号和槽的链接,QSignalMapper给我们解决了这个难题。     今天完成这个相似的功能时,不知道怎...
  • u013704336
  • u013704336
  • 2015-03-13 16:06:49
  • 1564
收藏助手
不良信息举报
您举报文章:QT SignalMapper(信号映射器)
举报原因:
原因补充:

(最多只允许输入30个字)