source: trunk/doc/src/objectmodel/signalsandslots.qdoc@ 769

Last change on this file since 769 was 769, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.3 sources from branches/vendor/nokia/qt.

  • Property svn:eol-style set to native
File size: 20.5 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the documentation of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this 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 have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42/*!
43 \page signalsandslots.html
44 \title Signals and Slots
45 \brief An overview of Qt's signals and slots inter-object
46 communication mechanism.
47
48 Signals and slots are used for communication between objects. The
49 signals and slots mechanism is a central feature of Qt and
50 probably the part that differs most from the features provided by
51 other frameworks.
52
53 \tableofcontents
54
55 \section1 Introduction
56
57 In GUI programming, when we change one widget, we often want
58 another widget to be notified. More generally, we want objects of
59 any kind to be able to communicate with one another. For example,
60 if a user clicks a \gui{Close} button, we probably want the
61 window's \l{QWidget::close()}{close()} function to be called.
62
63 Older toolkits achieve this kind of communication using
64 callbacks. A callback is a pointer to a function, so if you want
65 a processing function to notify you about some event you pass a
66 pointer to another function (the callback) to the processing
67 function. The processing function then calls the callback when
68 appropriate. Callbacks have two fundamental flaws: Firstly, they
69 are not type-safe. We can never be certain that the processing
70 function will call the callback with the correct arguments.
71 Secondly, the callback is strongly coupled to the processing
72 function since the processing function must know which callback
73 to call.
74
75 \section1 Signals and Slots
76
77 In Qt, we have an alternative to the callback technique: We use
78 signals and slots. A signal is emitted when a particular event
79 occurs. Qt's widgets have many predefined signals, but we can
80 always subclass widgets to add our own signals to them. A slot
81 is a function that is called in response to a particular signal.
82 Qt's widgets have many pre-defined slots, but it is common
83 practice to subclass widgets and add your own slots so that you
84 can handle the signals that you are interested in.
85
86 \img abstract-connections.png
87 \omit
88 \caption An abstract view of some signals and slots connections
89 \endomit
90
91 The signals and slots mechanism is type safe: The signature of a
92 signal must match the signature of the receiving slot. (In fact a
93 slot may have a shorter signature than the signal it receives
94 because it can ignore extra arguments.) Since the signatures are
95 compatible, the compiler can help us detect type mismatches.
96 Signals and slots are loosely coupled: A class which emits a
97 signal neither knows nor cares which slots receive the signal.
98 Qt's signals and slots mechanism ensures that if you connect a
99 signal to a slot, the slot will be called with the signal's
100 parameters at the right time. Signals and slots can take any
101 number of arguments of any type. They are completely type safe.
102
103 All classes that inherit from QObject or one of its subclasses
104 (e.g., QWidget) can contain signals and slots. Signals are emitted by
105 objects when they change their state in a way that may be interesting
106 to other objects. This is all the object does to communicate. It
107 does not know or care whether anything is receiving the signals it
108 emits. This is true information encapsulation, and ensures that the
109 object can be used as a software component.
110
111 Slots can be used for receiving signals, but they are also normal
112 member functions. Just as an object does not know if anything receives
113 its signals, a slot does not know if it has any signals connected to
114 it. This ensures that truly independent components can be created with
115 Qt.
116
117 You can connect as many signals as you want to a single slot, and a
118 signal can be connected to as many slots as you need. It is even
119 possible to connect a signal directly to another signal. (This will
120 emit the second signal immediately whenever the first is emitted.)
121
122 Together, signals and slots make up a powerful component programming
123 mechanism.
124
125 \section1 A Small Example
126
127 A minimal C++ class declaration might read:
128
129 \snippet doc/src/snippets/signalsandslots/signalsandslots.h 0
130
131 A small QObject-based class might read:
132
133 \snippet doc/src/snippets/signalsandslots/signalsandslots.h 1
134 \codeline
135 \snippet doc/src/snippets/signalsandslots/signalsandslots.h 2
136 \snippet doc/src/snippets/signalsandslots/signalsandslots.h 3
137
138 The QObject-based version has the same internal state, and provides
139 public methods to access the state, but in addition it has support
140 for component programming using signals and slots. This class can
141 tell the outside world that its state has changed by emitting a
142 signal, \c{valueChanged()}, and it has a slot which other objects
143 can send signals to.
144
145 All classes that contain signals or slots must mention
146 Q_OBJECT at the top of their declaration. They must also derive
147 (directly or indirectly) from QObject.
148
149 Slots are implemented by the application programmer.
150 Here is a possible implementation of the \c{Counter::setValue()}
151 slot:
152
153 \snippet doc/src/snippets/signalsandslots/signalsandslots.cpp 0
154
155 The \c{emit} line emits the signal \c valueChanged() from the
156 object, with the new value as argument.
157
158 In the following code snippet, we create two \c Counter objects
159 and connect the first object's \c valueChanged() signal to the
160 second object's \c setValue() slot using QObject::connect():
161
162 \snippet doc/src/snippets/signalsandslots/signalsandslots.cpp 1
163 \snippet doc/src/snippets/signalsandslots/signalsandslots.cpp 2
164 \codeline
165 \snippet doc/src/snippets/signalsandslots/signalsandslots.cpp 3
166 \snippet doc/src/snippets/signalsandslots/signalsandslots.cpp 4
167
168 Calling \c{a.setValue(12)} makes \c{a} emit a
169 \c{valueChanged(12)} signal, which \c{b} will receive in its
170 \c{setValue()} slot, i.e. \c{b.setValue(12)} is called. Then
171 \c{b} emits the same \c{valueChanged()} signal, but since no slot
172 has been connected to \c{b}'s \c{valueChanged()} signal, the
173 signal is ignored.
174
175 Note that the \c{setValue()} function sets the value and emits
176 the signal only if \c{value != m_value}. This prevents infinite
177 looping in the case of cyclic connections (e.g., if
178 \c{b.valueChanged()} were connected to \c{a.setValue()}).
179
180 By default, for every connection you make, a signal is emitted;
181 two signals are emitted for duplicate connections. You can break
182 all of these connections with a single disconnect() call.
183 If you pass the Qt::UniqueConnection \a type, the connection will only
184 be made if it is not a duplicate. If there is already a duplicate
185 (exact same signal to the exact same slot on the same objects),
186 the connection will fail and connect will return false
187
188 This example illustrates that objects can work together without needing to
189 know any information about each other. To enable this, the objects only
190 need to be connected together, and this can be achieved with some simple
191 QObject::connect() function calls, or with \c{uic}'s
192 \l{Using a Designer UI File in Your Application#Automatic Connections}
193 {automatic connections} feature.
194
195 \section1 Building the Example
196
197 The C++ preprocessor changes or removes the \c{signals},
198 \c{slots}, and \c{emit} keywords so that the compiler is
199 presented with standard C++.
200
201 By running the \l moc on class definitions that contain signals
202 or slots, a C++ source file is produced which should be compiled
203 and linked with the other object files for the application. If
204 you use \l qmake, the makefile rules to automatically invoke \c
205 moc will be added to your project's makefile.
206
207 \section1 Signals
208
209 Signals are emitted by an object when its internal state has changed
210 in some way that might be interesting to the object's client or owner.
211 Only the class that defines a signal and its subclasses can emit the
212 signal.
213
214 When a signal is emitted, the slots connected to it are usually
215 executed immediately, just like a normal function call. When this
216 happens, the signals and slots mechanism is totally independent of
217 any GUI event loop. Execution of the code following the \c emit
218 statement will occur once all slots have returned. The situation is
219 slightly different when using \l{Qt::ConnectionType}{queued
220 connections}; in such a case, the code following the \c emit keyword
221 will continue immediately, and the slots will be executed later.
222
223 If several slots are connected to one signal, the slots will be
224 executed one after the other, in the order they have been connected,
225 when the signal is emitted.
226
227 Signals are automatically generated by the \l moc and must not be
228 implemented in the \c .cpp file. They can never have return types
229 (i.e. use \c void).
230
231 A note about arguments: Our experience shows that signals and slots
232 are more reusable if they do not use special types. If
233 QScrollBar::valueChanged() were to use a special type such as the
234 hypothetical QScrollBar::Range, it could only be connected to
235 slots designed specifically for QScrollBar. Connecting different
236 input widgets together would be impossible.
237
238 \section1 Slots
239
240 A slot is called when a signal connected to it is emitted. Slots are
241 normal C++ functions and can be called normally; their only special
242 feature is that signals can be connected to them.
243
244 Since slots are normal member functions, they follow the normal C++
245 rules when called directly. However, as slots, they can be invoked
246 by any component, regardless of its access level, via a signal-slot
247 connection. This means that a signal emitted from an instance of an
248 arbitrary class can cause a private slot to be invoked in an instance
249 of an unrelated class.
250
251 You can also define slots to be virtual, which we have found quite
252 useful in practice.
253
254 Compared to callbacks, signals and slots are slightly slower
255 because of the increased flexibility they provide, although the
256 difference for real applications is insignificant. In general,
257 emitting a signal that is connected to some slots, is
258 approximately ten times slower than calling the receivers
259 directly, with non-virtual function calls. This is the overhead
260 required to locate the connection object, to safely iterate over
261 all connections (i.e. checking that subsequent receivers have not
262 been destroyed during the emission), and to marshall any
263 parameters in a generic fashion. While ten non-virtual function
264 calls may sound like a lot, it's much less overhead than any \c
265 new or \c delete operation, for example. As soon as you perform a
266 string, vector or list operation that behind the scene requires
267 \c new or \c delete, the signals and slots overhead is only
268 responsible for a very small proportion of the complete function
269 call costs.
270
271 The same is true whenever you do a system call in a slot; or
272 indirectly call more than ten functions. On an i586-500, you can
273 emit around 2,000,000 signals per second connected to one
274 receiver, or around 1,200,000 per second connected to two
275 receivers. The simplicity and flexibility of the signals and
276 slots mechanism is well worth the overhead, which your users
277 won't even notice.
278
279 Note that other libraries that define variables called \c signals
280 or \c slots may cause compiler warnings and errors when compiled
281 alongside a Qt-based application. To solve this problem, \c
282 #undef the offending preprocessor symbol.
283
284 \section1 Meta-Object Information
285
286 The meta-object compiler (\l moc) parses the class declaration in
287 a C++ file and generates C++ code that initializes the
288 meta-object. The meta-object contains the names of all the signal
289 and slot members, as well as pointers to these functions.
290
291 The meta-object contains additional information such as the
292 object's \link QObject::className() class name\endlink. You can
293 also check if an object \link QObject::inherits()
294 inherits\endlink a specific class, for example:
295
296 \snippet doc/src/snippets/signalsandslots/signalsandslots.cpp 5
297 \snippet doc/src/snippets/signalsandslots/signalsandslots.cpp 6
298
299 The meta-object information is also used by qobject_cast<T>(), which
300 is similar to QObject::inherits() but is less error-prone:
301
302 \snippet doc/src/snippets/signalsandslots/signalsandslots.cpp 7
303
304 See \l{Meta-Object System} for more information.
305
306 \section1 A Real Example
307
308 Here is a simple commented example of a widget.
309
310 \snippet doc/src/snippets/signalsandslots/lcdnumber.h 0
311 \snippet doc/src/snippets/signalsandslots/lcdnumber.h 1
312 \codeline
313 \snippet doc/src/snippets/signalsandslots/lcdnumber.h 2
314 \codeline
315 \snippet doc/src/snippets/signalsandslots/lcdnumber.h 3
316 \snippet doc/src/snippets/signalsandslots/lcdnumber.h 4
317 \snippet doc/src/snippets/signalsandslots/lcdnumber.h 5
318
319 \c LcdNumber inherits QObject, which has most of the signal-slot
320 knowledge, via QFrame and QWidget. It is somewhat similar to the
321 built-in QLCDNumber widget.
322
323 The Q_OBJECT macro is expanded by the preprocessor to declare
324 several member functions that are implemented by the \c{moc}; if
325 you get compiler errors along the lines of "undefined reference
326 to vtable for \c{LcdNumber}", you have probably forgotten to
327 \l{moc}{run the moc} or to include the moc output in the link
328 command.
329
330 \snippet doc/src/snippets/signalsandslots/lcdnumber.h 6
331 \snippet doc/src/snippets/signalsandslots/lcdnumber.h 7
332
333 It's not obviously relevant to the moc, but if you inherit
334 QWidget you almost certainly want to have the \c parent argument
335 in your constructor and pass it to the base class's constructor.
336
337 Some destructors and member functions are omitted here; the \c
338 moc ignores member functions.
339
340 \snippet doc/src/snippets/signalsandslots/lcdnumber.h 8
341 \snippet doc/src/snippets/signalsandslots/lcdnumber.h 9
342
343 \c LcdNumber emits a signal when it is asked to show an impossible
344 value.
345
346 If you don't care about overflow, or you know that overflow
347 cannot occur, you can ignore the \c overflow() signal, i.e. don't
348 connect it to any slot.
349
350 If on the other hand you want to call two different error
351 functions when the number overflows, simply connect the signal to
352 two different slots. Qt will call both (in arbitrary order).
353
354 \snippet doc/src/snippets/signalsandslots/lcdnumber.h 10
355 \snippet doc/src/snippets/signalsandslots/lcdnumber.h 11
356 \snippet doc/src/snippets/signalsandslots/lcdnumber.h 12
357 \codeline
358 \snippet doc/src/snippets/signalsandslots/lcdnumber.h 13
359
360 A slot is a receiving function used to get information about
361 state changes in other widgets. \c LcdNumber uses it, as the code
362 above indicates, to set the displayed number. Since \c{display()}
363 is part of the class's interface with the rest of the program,
364 the slot is public.
365
366 Several of the example programs connect the
367 \l{QScrollBar::valueChanged()}{valueChanged()} signal of a
368 QScrollBar to the \c display() slot, so the LCD number
369 continuously shows the value of the scroll bar.
370
371 Note that \c display() is overloaded; Qt will select the
372 appropriate version when you connect a signal to the slot. With
373 callbacks, you'd have to find five different names and keep track
374 of the types yourself.
375
376 Some irrelevant member functions have been omitted from this
377 example.
378
379 \section1 Signals And Slots With Default Arguments
380
381 The signatures of signals and slots may contain arguments, and the
382 arguments can have default values. Consider QObject::destroyed():
383
384 \code
385 void destroyed(QObject* = 0);
386 \endcode
387
388 When a QObject is deleted, it emits this QObject::destroyed()
389 signal. We want to catch this signal, wherever we might have a
390 dangling reference to the deleted QObject, so we can clean it up.
391 A suitable slot signature might be:
392
393 \code
394 void objectDestroyed(QObject* obj = 0);
395 \endcode
396
397 To connect the signal to the slot, we use QObject::connect() and
398 the \c{SIGNAL()} and \c{SLOT()} macros. The rule about whether to
399 include arguments or not in the \c{SIGNAL()} and \c{SLOT()}
400 macros, if the arguments have default values, is that the
401 signature passed to the \c{SIGNAL()} macro must \e not have fewer
402 arguments than the signature passed to the \c{SLOT()} macro.
403
404 All of these would work:
405 \code
406 connect(sender, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(Qbject*)));
407 connect(sender, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed()));
408 connect(sender, SIGNAL(destroyed()), this, SLOT(objectDestroyed()));
409 \endcode
410 But this one won't work:
411 \code
412 connect(sender, SIGNAL(destroyed()), this, SLOT(objectDestroyed(QObject*)));
413 \endcode
414
415 ...because the slot will be expecting a QObject that the signal
416 will not send. This connection will report a runtime error.
417
418 \section1 Advanced Signals and Slots Usage
419
420 For cases where you may require information on the sender of the
421 signal, Qt provides the QObject::sender() function, which returns
422 a pointer to the object that sent the signal.
423
424 The QSignalMapper class is provided for situations where many
425 signals are connected to the same slot and the slot needs to
426 handle each signal differently.
427
428 Suppose you have three push buttons that determine which file you
429 will open: "Tax File", "Accounts File", or "Report File".
430
431 In order to open the correct file, you use QSignalMapper::setMapping() to
432 map all the clicked() signals to a QSignalMapper object. Then you connect
433 the file's QPushButton::clicked() signal to the QSignalMapper::map() slot.
434
435 \snippet doc/src/snippets/signalmapper/filereader.cpp 0
436
437 Then, you connect the \l{QSignalMapper::}{mapped()} signal to
438 \c{readFile()} where a different file will be opened, depending on
439 which push button is pressed.
440
441 \snippet doc/src/snippets/signalmapper/filereader.cpp 1
442
443 \sa {Meta-Object System}, {Qt's Property System}
444
445 \target 3rd Party Signals and Slots
446 \section2 Using Qt with 3rd Party Signals and Slots
447
448 It is possible to use Qt with a 3rd party signal/slot mechanism.
449 You can even use both mechanisms in the same project. Just add the
450 following line to your qmake project (.pro) file.
451
452 \snippet doc/src/snippets/code/doc_src_containers.qdoc 22
453
454 It tells Qt not to define the moc keywords \c{signals}, \c{slots},
455 and \c{emit}, because these names will be used by a 3rd party
456 library, e.g. Boost. Then to continue using Qt signals and slots
457 with the \c{no_keywords} flag, simply replace all uses of the Qt
458 moc keywords in your sources with the corresponding Qt macros
459 Q_SIGNALS (or Q_SIGNAL), Q_SLOTS (or Q_SLOT), and Q_EMIT.
460*/
Note: See TracBrowser for help on using the repository browser.