source: trunk/src/corelib/kernel/qsignalmapper.cpp@ 67

Last change on this file since 67 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 9.3 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** Contact: Qt Software Information ([email protected])
5**
6** This file is part of the QtCore module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial Usage
10** Licensees holding valid Qt Commercial licenses may use this file in
11** accordance with the Qt Commercial License Agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Nokia.
14**
15** GNU Lesser General Public License Usage
16** Alternatively, this file may be used under the terms of the GNU Lesser
17** General Public License version 2.1 as published by the Free Software
18** Foundation and appearing in the file LICENSE.LGPL included in the
19** packaging of this file. Please review the following information to
20** ensure the GNU Lesser General Public License version 2.1 requirements
21** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22**
23** In addition, as a special exception, Nokia gives you certain
24** additional rights. These rights are described in the Nokia Qt LGPL
25** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26** package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you are unsure which license is appropriate for your use, please
37** contact the sales department at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "qsignalmapper.h"
43#ifndef QT_NO_SIGNALMAPPER
44#include "qhash.h"
45#include "qobject_p.h"
46
47QT_BEGIN_NAMESPACE
48
49class QSignalMapperPrivate : public QObjectPrivate
50{
51 Q_DECLARE_PUBLIC(QSignalMapper)
52public:
53 void _q_senderDestroyed() {
54 Q_Q(QSignalMapper);
55 q->removeMappings(q->sender());
56 }
57 QHash<QObject *, int> intHash;
58 QHash<QObject *, QString> stringHash;
59 QHash<QObject *, QWidget*> widgetHash;
60 QHash<QObject *, QObject*> objectHash;
61
62};
63
64
65/*!
66 \class QSignalMapper
67 \brief The QSignalMapper class bundles signals from identifiable senders.
68
69 \ingroup io
70 \mainclass
71
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.
75
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
81 removeMappings().
82
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
88 clicked.
89
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
92 that was clicked:
93
94 \snippet doc/src/snippets/qsignalmapper/buttonwidget.h 0
95 \snippet doc/src/snippets/qsignalmapper/buttonwidget.h 1
96
97 The only function that we need to implement is the constructor:
98
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
102
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.
112
113 \sa QObject, QButtonGroup, QActionGroup
114*/
115
116/*!
117 Constructs a QSignalMapper with parent \a parent.
118*/
119QSignalMapper::QSignalMapper(QObject* parent)
120 : QObject(*new QSignalMapperPrivate, parent)
121{
122}
123
124#ifdef QT3_SUPPORT
125/*!
126 \overload QSignalMapper()
127 \obsolete
128 */
129QSignalMapper::QSignalMapper(QObject *parent, const char *name)
130 : QObject(*new QSignalMapperPrivate, parent)
131{
132 setObjectName(QString::fromAscii(name));
133}
134#endif
135
136/*!
137 Destroys the QSignalMapper.
138*/
139QSignalMapper::~QSignalMapper()
140{
141}
142
143/*!
144 Adds a mapping so that when map() is signalled from the given \a
145 sender, the signal mapped(\a id) is emitted.
146
147 There may be at most one integer ID for each sender.