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 <thiago.macieira@intel.com>
This commit is contained in:
Olivier Goffart 2011-12-15 06:57:17 +01:00 committed by Qt by Nokia
parent 7c0153faf7
commit 889092504e
2 changed files with 27 additions and 1 deletions

View 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;
}
/*!

View 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