From 889092504e0f1e67dc9c7f27817fb809d7170132 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Thu, 15 Dec 2011 06:57:17 +0100 Subject: Call connectNotify when connecting with function pointer Some objects expect connectNotify to be called in order the signal to be emitted. Change-Id: Id0460d9c2aef8f9c3618a2b62b2119a790e06f30 Reviewed-by: Thiago Macieira --- src/corelib/kernel/qobject.cpp | 14 +++++++++++++- tests/auto/corelib/kernel/qobject/tst_qobject.cpp | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index f151acd703..c51507c2e2 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -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(senderMetaObject->d.data)->methodData + + 5 * (signal_index - signalOffset)]; + QVarLengthArray signalSignature(qstrlen(sig) + 2); + signalSignature.data()[0] = char(QSIGNAL_CODE + '0'); + strcpy(signalSignature.data() + 1 , sig); + s->connectNotify(signalSignature.data()); + + return ret; } /*! diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp index c1471e4f21..9bd54bd035 100644 --- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp +++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp @@ -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 -- cgit v1.2.3