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();
}
版权声明:本文为博主原创文章,转载请标明出处。

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

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

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

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

Qt SignalMapper 使用实例

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

Qt使用connect函数时向slot传递参数

设想这样一种场景:共有5个button,button1~button5,点击button1时输出“button 1 clicked”,点击button2时输出“button 2 clicked”,该如...
  • imred
  • imred
  • 2017年06月08日 22:52
  • 1181

QSignalMapper 信号映射

QSignalMapper类收集了一系列的无参信号,然后使用相对于信号发送者来说的整数、字符串或控件参数来重新发送它们。...
  • Amnes1a
  • Amnes1a
  • 2017年04月11日 13:07
  • 298

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

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

Qt:信号与槽(Signals and Slots) 下

http://hi.baidu.com/spygg/item/519f4dd7575704ce1b72b4e7 信号(Signals) 只有定义了信号的类及其子类可以发出信号。   一个信号发...
  • zb872676223
  • zb872676223
  • 2014年04月16日 13:32
  • 5026

QSignalMapper

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

QT——QSignalMapper

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

QSignalMapper的使用

QSignalMapper的使用 1. 可以吧无参数的信号
  • lpmygod
  • lpmygod
  • 2014年10月26日 16:36
  • 4032
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QT SignalMapper(信号映射器)
举报原因:
原因补充:

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