Do not consider a signal to be connected if only a signal spy is installed.

This fixes QtQuick key handling not propagating key events beyond the
specific onXPressed handlers, due to erroneously thinking those exist,
when signal spy callbacks are present.

Considering signal spies for isSignalConnected() goes back to 87239ef6 in
Qt4, and seems to be there just due to this code being based on activate(),
where this check obviously makes sense.

Change-Id: Iad41e42a8d3ee2a16a55be7d1a7cdc51484981ce
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
This commit is contained in:
Volker Krause 2014-01-16 11:31:51 +01:00 committed by The Qt Project
parent 87d2fa5f84
commit 9132dbb659
2 changed files with 6 additions and 5 deletions

View File

@ -3453,8 +3453,11 @@ void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_i
{
int signal_index = signalOffset + local_signal_index;
if (!sender->d_func()->isSignalConnected(signal_index))
if (!sender->d_func()->isSignalConnected(signal_index)
&& !qt_signal_spy_callback_set.signal_begin_callback
&& !qt_signal_spy_callback_set.signal_end_callback) {
return; // nothing connected to these signals, and no spy
}
if (sender->d_func()->blockSig)
return;

View File

@ -248,7 +248,7 @@ public:
Returns \c true if the signal with index \a signal_index from object \a sender is connected.
Signals with indices above a certain range are always considered connected (see connectedSignals
in QObjectPrivate). If a signal spy is installed, all signals are considered connected.
in QObjectPrivate).
\a signal_index must be the index returned by QObjectPrivate::signalIndex;
*/
@ -257,9 +257,7 @@ inline bool QObjectPrivate::isSignalConnected(uint signal_index) const
return signal_index >= sizeof(connectedSignals) * 8
|| (connectedSignals[signal_index >> 5] & (1 << (signal_index & 0x1f))
|| (declarativeData && QAbstractDeclarativeData::isSignalConnected
&& QAbstractDeclarativeData::isSignalConnected(declarativeData, q_func(), signal_index))
|| qt_signal_spy_callback_set.signal_begin_callback
|| qt_signal_spy_callback_set.signal_end_callback);
&& QAbstractDeclarativeData::isSignalConnected(declarativeData, q_func(), signal_index)));
}
inline QObjectPrivate::Sender *QObjectPrivate::setCurrentSender(QObject *receiver,