Класс объединяет сигналы от идентифицируемых отправителей. Этот класс собирает набор сигналов без параметров и повторно генерирует их с целочисленными параметрами, параметрами строки или виджета, соответствующими объекту, который отправил сигнал. Класс поддерживает сопоставление определенных строк или целых чисел с конкретными объектами с помощью setMapping(). Затем сигналы объектов могут быть подключены к слоту map(), который будет излучать сигнал mapped() со строкой или целым числом, связанным с исходным объектом сигнализации. Сопоставления могут быть удалены позже с помощью removeMappings ().
Для примера создадим небольшое приложение, которое запускает таймер и присваивает ему личный идентификатор. Через connect() связываем QTimer и QSignalMapper. При срабатывании таймера сигнал переправляется на QSignalMapper который связывает его с пользовательским идентификатором и вызывает слот crossCapture(int), который подключен к QSignalMapper.
Определение класса
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTimer> #include <QSignalMapper> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private: Ui::Widget *ui; int id; private slots: void buttonClick(); void crossCapture(int); }; #endif // WIDGET_H
Реализация класса
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget),id(0) { ui->setupUi(this); connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(buttonClick())); } Widget::~Widget() { delete ui; } void Widget::buttonClick() { QTimer* timer = new QTimer(this); timer->setInterval(5000); timer->setSingleShot(true); QSignalMapper * signalMapper = new QSignalMapper(this); connect(timer,SIGNAL(timeout()),signalMapper,SLOT( map())); signalMapper->setMapping(timer,id++); connect(signalMapper,SIGNAL(mapped(int)),this,SLOT(crossCapture(int))); ui->textEdit->append(QString("Start timer: %1").arg(id)); timer->start(); } void Widget::crossCapture(int i) { ui->textEdit->append(QString("Signal mapper: %1 Stop timer %1").arg(i)); }
При нажатие на кнопку вызывается слот buttonClick(), который создает новый экземпляр QTimer и QSignalMapper. Таймер срабатывает раз 5 секунд, один раз и переходит на переопределенный слот crossCapture(int i).