简单的理解,可以把SignalMapper这个类看成是信号的翻译和转发器, 它可以把一个无参数的信号翻译成带int参数、QString参数、QObject*参数或者QWidget*参数的信号, 并将之转发。 这么一说大家有没有联想到该类的适用范围呢? 呵呵, 是不是一下就想到了如果我有一堆的button, 可以把clicked事件放在一个函数里处理, 只要给button编个号或者给button起个名就行了, 这样就不用给每个button写一个slot了,岂不是很方便?
下面这段代码实现该功能
#pragma once #include <QWidget> #include <QSignalMapper> #include <QGridLayout> #include <QPushButton> #include <QMessageBox> class main_widget : public QWidget { Q_OBJECT public: main_widget(QWidget *parent=0); ~main_widget(); private: QSignalMapper *signalMapper; private slots: void doClicked(const QString &btnname); };
#include "main_widget.h" main_widget::main_widget(QWidget *parent) : QWidget(parent) { 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]); //原始信号传递给signalmapper connect(button,SIGNAL(clicked()),signalMapper,SLOT(map())); //设置signalmapper的转发规则,转发参数为QString类型的信号, //并把texts[i]的内容作为实参传递 signalMapper->setMapping(button,texts[i]); gridLayout->addWidget(button, i / 3, i % 3); } connect(signalMapper,SIGNAL(mapped(const QString &)),this,SLOT(doClicked(const QString &))); setLayout(gridLayout); } main_widget::~main_widget() { } void main_widget::doClicked(const QString &btnname) { QMessageBox::information(this, "Clicked", btnname + " is clicked!");//显示被按下的btn名称。 }
从这个例子来看QSignalMapper的用法是非常简单的, 也很容易理解。
*首先把原始不带参数的信号连接到signalmapper的map槽函数, 这样signalmapper能在第一时间接收到原始信号;
*其次调用setMapper方法告诉signalmapper怎样去处理原始信号。 在这个例子中是把原始信号转化为一个带QString参数的信号
*最后接收转化后的带参数信号, 这里所把转化后的信号与槽函数连接, 在槽函数中获得需要的数据。
转自:http://blog.sina.com.cn/s/blog_a3eacdb20101ddcf.html