Call connectNotify when connecting with function pointer
authorOlivier Goffart <ogoffart@woboq.com>
Thu, 15 Dec 2011 05:57:17 +0000 (06:57 +0100)
committerQt by Nokia <qt-info@nokia.com>
Sun, 29 Jan 2012 11:40:51 +0000 (12:40 +0100)
Some objects expect connectNotify to be called in order the signal to be
emitted.

Change-Id: Id0460d9c2aef8f9c3618a2b62b2119a790e06f30
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
src/corelib/kernel/qobject.cpp
tests/auto/corelib/kernel/qobject/tst_qobject.cpp

index f151acd..c51507c 100644 (file)
@@ -4038,7 +4038,19 @@ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signa
     }
 
     QObjectPrivate::get(s)->addConnection(signal_index, c.data());
-    return QMetaObject::Connection(c.take());
+    QMetaObject::Connection ret(c.take());
+    locker.unlock();
+
+    // reconstruct the signature to call connectNotify
+    const char *sig = senderMetaObject->d.stringdata + senderMetaObject->d.data[
+        reinterpret_cast<const QMetaObjectPrivate*>(senderMetaObject->d.data)->methodData
+            + 5 * (signal_index - signalOffset)];
+    QVarLengthArray<char> signalSignature(qstrlen(sig) + 2);
+    signalSignature.data()[0] = char(QSIGNAL_CODE + '0');
+    strcpy(signalSignature.data() + 1 , sig);
+    s->connectNotify(signalSignature.data());
+
+    return ret;
 }
 
 /*!
index c1471e4..9bd54bd 100644 (file)
@@ -75,6 +75,7 @@ private slots:
     void findChildren();
     void connectDisconnectNotify_data();
     void connectDisconnectNotify();
+    void connectNotifyPtr();
     void emitInDefinedOrder();
     void customTypes();
     void streamCustomTypes();
@@ -849,6 +850,19 @@ void tst_QObject::connectDisconnectNotify()
     delete r;
 }
 
+void tst_QObject::connectNotifyPtr()
+{
+    NotifyObject *s = new NotifyObject;
+    NotifyObject *r = new NotifyObject;
+
+    connect( (SenderObject*)s, &SenderObject::signal1, (ReceiverObject*)r, &ReceiverObject::slot1 );
+    QCOMPARE( s->org_signal, s->nw_signal );
+    QCOMPARE( s->org_signal.toLatin1(), QMetaObject::normalizedSignature(SIGNAL(signal1())));
+
+    delete s;
+    delete r;
+}
+
 class SequenceObject : public ReceiverObject
 {
     Q_OBJECT