QT中通过信号/槽机制,将信号与槽函数关联。有时候希望获得信号发送者信息,QT提供了QObject::sender()函数来返回发送该信号的对象的指针。但是如果有多个信号关联到了同一个槽上,而在该槽中需要对每一个信号进行不同的处理,使用上面的方法就很麻烦了。对于这种情况,便可以使用QSignalMapper类。QSignalMapper可以叫做信号映射器,可以实现对多个相同部件的相同信号进行映射,为其添加字符串或者数值参数,然后再发射出去。
示例如下:
mainwidget.h
1 #ifndef MAINWIDGET_H
2 #define MAINWIDGET_H
3 #include <QWidget>
4 #include <QSignalMapper>
5 class MainWidget : public QWidget
6 {
7 Q_OBJECT
8 //槽函数
9 private slots:
10 //处理最终信号的槽
11 void doClicked(const QString & btnname);
12 private:
13 QSignalMapper *signalMapper;
14 public:
15 MainWidget(QWidget *parent = 0);
16 };
17 #endif // MAINWIDGET_H
mainwidget.cpp
1 #include <QGridLayout>
2 #include <QPushButton>
3 #include <QMessageBox>
4 #include "mainwidget.h"
5 void MainWidget::doClicked(const QString &btnname)
6 {
7 //显示被按下的btn名称。
8 QMessageBox::information(this, "Clicked", btnname + " is clicked!");
9 }
10 MainWidget::MainWidget(QWidget *parent) : QWidget(parent)
11 {
12 //10个button
13 QString buttontext = "btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn10";
14 QStringList texts = buttontext.split(",");
15 signalMapper = new QSignalMapper(this);
16 QGridLayout *gridLayout = new QGridLayout;
17 for (int i = 0; i < texts.size(); ++i)
18 {
19 QPushButton *button = new QPushButton(texts[i], this);
20 button->setObjectName(texts[i]);
21 //原始信号传递给signalmapper
22 connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
23 signalMapper->setMapping(button, texts[i]);
24 //设置signalmapper的转发规则, 转发为参数为QString类型的信号, 并把texts[i]的内容作为实参传递。
25 gridLayout->addWidget(button, i / 3, i % 3);
26 }
27 //将转发的信号连接到最终的槽函数
28 connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(doClicked(const QString &)));
29 setLayout(gridLayout);
30 }
main.cpp
1 #include "mainwidget.h"
2 #include <QApplication>
3 int main(int argc, char *argv[])
4 {
5 QApplication a(argc, argv);
6 MainWidget w;
7 w.show();
8 return a.exec();
9 }