1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the QtCore module of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
42 #include "qsignalmapper.h"
43 #ifndef QT_NO_SIGNALMAPPER
45 #include "qobject_p.h"
49 class QSignalMapperPrivate : public QObjectPrivate
51 Q_DECLARE_PUBLIC(QSignalMapper)
53 void _q_senderDestroyed() {
55 q->removeMappings(q->sender());
57 QHash<QObject *, int> intHash;
58 QHash<QObject *, QString> stringHash;
59 QHash<QObject *, QWidget*> widgetHash;
60 QHash<QObject *, QObject*> objectHash;
67 \brief The QSignalMapper class bundles signals from identifiable senders.
72 This class collects a set of parameterless signals, and re-emits
73 them with integer, string or widget parameters corresponding to
74 the object that sent the signal.
76 The class supports the mapping of particular strings or integers
77 with particular objects using setMapping(). The objects' signals
78 can then be connected to the map() slot which will emit the
79 mapped() signal with the string or integer associated with the
80 original signalling object. Mappings can be removed later using
83 Example: Suppose we want to create a custom widget that contains
84 a group of buttons (like a tool palette). One approach is to
85 connect each button's \c clicked() signal to its own custom slot;
86 but in this example we want to connect all the buttons to a
87 single slot and parameterize the slot by the button that was
90 Here's the definition of a simple custom widget that has a single
91 signal, \c clicked(), which is emitted with the text of the button
94 \snippet doc/src/snippets/qsignalmapper/buttonwidget.h 0
95 \snippet doc/src/snippets/qsignalmapper/buttonwidget.h 1
97 The only function that we need to implement is the constructor:
99 \snippet doc/src/snippets/qsignalmapper/buttonwidget.cpp 0
100 \snippet doc/src/snippets/qsignalmapper/buttonwidget.cpp 1
101 \snippet doc/src/snippets/qsignalmapper/buttonwidget.cpp 2
103 A list of texts is passed to the constructor. A signal mapper is
104 constructed and for each text in the list a QPushButton is
105 created. We connect each button's \c clicked() signal to the
106 signal mapper's map() slot, and create a mapping in the signal
107 mapper from each button to the button's text. Finally we connect
108 the signal mapper's mapped() signal to the custom widget's \c
109 clicked() signal. When the user clicks a button, the custom
110 widget will emit a single \c clicked() signal whose argument is
111 the text of the button the user clicked.
113 \sa QObject, QButtonGroup, QActionGroup
117 Constructs a QSignalMapper with parent \a parent.
119 QSignalMapper::QSignalMapper(QObject* parent)
120 : QObject(*new QSignalMapperPrivate, parent)
125 Destroys the QSignalMapper.
127 QSignalMapper::~QSignalMapper()
132 Adds a mapping so that when map() is signalled from the given \a
133 sender, the signal mapped(\a id) is emitted.
135 There may be at most one integer ID for each sender.
139 void QSignalMapper::setMapping(QObject *sender, int id)
142 d->intHash.insert(sender, id);
143 connect(sender, SIGNAL(destroyed()), this, SLOT(_q_senderDestroyed()));
147 Adds a mapping so that when map() is signalled from the \a sender,
148 the signal mapped(\a text ) is emitted.
150 There may be at most one text for each sender.
152 void QSignalMapper::setMapping(QObject *sender, const QString &text)
155 d->stringHash.insert(sender, text);
156 connect(sender, SIGNAL(destroyed()), this, SLOT(_q_senderDestroyed()));
160 Adds a mapping so that when map() is signalled from the \a sender,
161 the signal mapped(\a widget ) is emitted.
163 There may be at most one widget for each sender.
165 void QSignalMapper::setMapping(QObject *sender, QWidget *widget)
168 d->widgetHash.insert(sender, widget);
169 connect(sender, SIGNAL(destroyed()), this, SLOT(_q_senderDestroyed()));
173 Adds a mapping so that when map() is signalled from the \a sender,
174 the signal mapped(\a object ) is emitted.
176 There may be at most one object for each sender.
178 void QSignalMapper::setMapping(QObject *sender, QObject *object)
181 d->objectHash.insert(sender, object);
182 connect(sender, SIGNAL(destroyed()), this, SLOT(_q_senderDestroyed()));
186 Returns the sender QObject that is associated with the \a id.
190 QObject *QSignalMapper::mapping(int id) const
192 Q_D(const QSignalMapper);
193 return d->intHash.key(id);
199 QObject *QSignalMapper::mapping(const QString &id) const
201 Q_D(const QSignalMapper);
202 return d->stringHash.key(id);
208 Returns the sender QObject that is associated with the \a widget.
210 QObject *QSignalMapper::mapping(QWidget *widget) const
212 Q_D(const QSignalMapper);
213 return d->widgetHash.key(widget);
219 Returns the sender QObject that is associated with the \a object.
221 QObject *QSignalMapper::mapping(QObject *object) const
223 Q_D(const QSignalMapper);
224 return d->objectHash.key(object);
228 Removes all mappings for \a sender.
230 This is done automatically when mapped objects are destroyed.
232 void QSignalMapper::removeMappings(QObject *sender)
236 d->intHash.remove(sender);
237 d->stringHash.remove(sender);
238 d->widgetHash.remove(sender);
239 d->objectHash.remove(sender);
243 This slot emits signals based on which object sends signals to it.
245 void QSignalMapper::map() { map(sender()); }
248 This slot emits signals based on the \a sender object.
250 void QSignalMapper::map(QObject *sender)
253 if (d->intHash.contains(sender))
254 emit mapped(d->intHash.value(sender));
255 if (d->stringHash.contains(sender))
256 emit mapped(d->stringHash.value(sender));
257 if (d->widgetHash.contains(sender))
258 emit mapped(d->widgetHash.value(sender));
259 if (d->objectHash.contains(sender))
260 emit mapped(d->objectHash.value(sender));
265 \fn void QSignalMapper::mapped(int i)
267 This signal is emitted when map() is signalled from an object that
268 has an integer mapping set. The object's mapped integer is passed
275 \fn void QSignalMapper::mapped(const QString &text)
277 This signal is emitted when map() is signalled from an object that
278 has a string mapping set. The object's mapped string is passed in
285 \fn void QSignalMapper::mapped(QWidget *widget)
287 This signal is emitted when map() is signalled from an object that
288 has a widget mapping set. The object's mapped widget is passed in
295 \fn void QSignalMapper::mapped(QObject *object)
297 This signal is emitted when map() is signalled from an object that
298 has an object mapping set. The object provided by the map is passed in
306 #include "moc_qsignalmapper.cpp"
308 #endif // QT_NO_SIGNALMAPPER