Document the new connection syntax
authorOlivier Goffart <ogoffart@woboq.com>
Thu, 10 Nov 2011 11:17:53 +0000 (12:17 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 30 Nov 2011 16:18:51 +0000 (17:18 +0100)
It is already documented in the QObject API documentation, but
Also update the overview

Change-Id: I92f44a50222738530928e3f4e6e463b3210d3a29
Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
doc/src/core/objectmodel/signalsandslots.qdoc
doc/src/snippets/signalmapper/filereader.cpp
doc/src/snippets/signalsandslots/signalsandslots.cpp

index 2f8646e..175f7e1 100644 (file)
 
     Signals are emitted by an object when its internal state has changed
     in some way that might be interesting to the object's client or owner.
-    Only the class that defines a signal and its subclasses can emit the
-    signal.
+    Signals are public access functions and can be emitted from anywhere,
+    but we recommend to only emit them from the class that defines the
+    signal and its subclasses.
 
     When a signal is emitted, the slots connected to it are usually
     executed immediately, just like a normal function call. When this
     string, vector or list operation that behind the scene requires
     \c new or \c delete, the signals and slots overhead is only
     responsible for a very small proportion of the complete function
-    call costs.
-
-    The same is true whenever you do a system call in a slot; or
-    indirectly call more than ten functions. On an i586-500, you can
-    emit around 2,000,000 signals per second connected to one
-    receiver, or around 1,200,000 per second connected to two
-    receivers. The simplicity and flexibility of the signals and
-    slots mechanism is well worth the overhead, which your users
-    won't even notice.
+    call costs. The same is true whenever you do a system call in a slot;
+    or indirectly call more than ten functions.
+    The simplicity and flexibility of the signals and slots mechanism is
+    well worth the overhead, which your users won't even notice.
 
     Note that other libraries that define variables called \c signals
     or \c slots may cause compiler warnings and errors when compiled
     void objectDestroyed(QObject* obj = 0);
     \endcode
 
-    To connect the signal to the slot, we use QObject::connect() and
-    the \c{SIGNAL()} and \c{SLOT()} macros. The rule about whether to
+    To connect the signal to the slot, we use QObject::connect().
+    There are several ways to connect signal and slots. The first is to use
+    function pointers:
+    \code
+    connect(sender, &QObject::destroyed, this, &MyObject::objectDestroyed);
+    \endcode
+
+    There are several advantages to using connect() with function pointers.
+    First, it allows the compiler to check that the signal's arguments are
+    compatible with the slot's arguments. Arguments can also be implicitly
+    converted by the compiler, if needed.
+
+    You can also connect to functors or C++11 lamdas:
+
+    \code
+    connect(sender, &QObject::destroyed, [=](){ this->m_objects.remove(sender); });
+    \endcode
+
+    Note that if your compiler does not support C++11 variadic templates,
+    this syntax only works if the signal and slot have 3 arguments or less.
+
+    The other way to connect a signal to a slot is to use QObject::connect()
+    and the \c{SIGNAL} and \c{SLOT} macros.
+    The rule about whether to
     include arguments or not in the \c{SIGNAL()} and \c{SLOT()}
     macros, if the arguments have default values, is that the
     signature passed to the \c{SIGNAL()} macro must \e not have fewer
     ...because the slot will be expecting a QObject that the signal
     will not send. This connection will report a runtime error.
 
+    Note that signal and slot arguments are not checked by the compiler when
+    using this QObject::connect() overload.
+
     \section1 Advanced Signals and Slots Usage
 
     For cases where you may require information on the sender of the
 
     \snippet doc/src/snippets/signalmapper/filereader.cpp 1
 
-    \note The following code will compile and run, but due to signature normalization, the code will be slower.
-
-    \snippet doc/src/snippets/signalmapper/filereader.cpp 2
-
     \sa {Meta-Object System}, {Qt's Property System}
 
     \target 3rd Party Signals and Slots
index d7be2e8..49b6905 100644 (file)
@@ -57,12 +57,12 @@ FileReader::FileReader(QWidget *parent)
     signalMapper->setMapping(accountFileButton, QString("accountsfile.txt"));
     signalMapper->setMapping(reportFileButton, QString("reportfile.txt"));
 
-    connect(taxFileButton, SIGNAL(clicked()),
-        signalMapper, SLOT (map()));
-    connect(accountFileButton, SIGNAL(clicked()),
-        signalMapper, SLOT (map()));
-    connect(reportFileButton, SIGNAL(clicked()),
-        signalMapper, SLOT (map()));
+    connect(taxFileButton, &QPushButton::clicked,
+        signalMapper, &QSignalMapper::map);
+    connect(accountFileButton, &QPushButton::clicked,
+        signalMapper, &QSignalMapper::map);
+    connect(reportFileButton, &QPushButton::clicked,
+        signalMapper, &QSignalMapper::map);
 //! [0]
 
 //! [1]
index 4262232..19a8b4d 100644 (file)
@@ -57,8 +57,8 @@ int main()
 //! [1]
     Counter a, b;
 //! [1] //! [2]
-    QObject::connect(&a, SIGNAL(valueChanged(int)),
-                     &b, SLOT(setValue(int)));
+    QObject::connect(&a, &Counter::valueChanged,
+                     &b, &Counter::setValue);
 //! [2]
 
 //! [3]