diff options
Diffstat (limited to 'src/testlib/qsignalspy.h')
-rw-r--r-- | src/testlib/qsignalspy.h | 71 |
1 files changed, 50 insertions, 21 deletions
diff --git a/src/testlib/qsignalspy.h b/src/testlib/qsignalspy.h index 218a26ec5c..dc0c58044f 100644 --- a/src/testlib/qsignalspy.h +++ b/src/testlib/qsignalspy.h @@ -59,11 +59,8 @@ public: explicit QSignalSpy(const QObject *obj, const char *aSignal) : m_waiting(false) { - static const int memberOffset = QObject::staticMetaObject.methodCount(); - if (!obj) { - qWarning("QSignalSpy: Cannot spy on a null object"); + if (!isObjectValid(obj)) return; - } if (!aSignal) { qWarning("QSignalSpy: Null signal name is not valid"); @@ -83,11 +80,9 @@ public: return; } - if (!QMetaObject::connect(obj, sigIndex, this, memberOffset, - Qt::DirectConnection, nullptr)) { - qWarning("QSignalSpy: QMetaObject::connect returned false. Unable to connect."); + if (!connectToSignal(obj, sigIndex)) return; - } + sig = ba; initArgs(mo->method(sigIndex), obj); } @@ -100,11 +95,8 @@ public: QSignalSpy(const typename QtPrivate::FunctionPointer<Func>::Object *obj, Func signal0) : m_waiting(false) { - static const int memberOffset = QObject::staticMetaObject.methodCount(); - if (!obj) { - qWarning("QSignalSpy: Cannot spy on a null object"); + if (!isObjectValid(obj)) return; - } if (!signal0) { qWarning("QSignalSpy: Null signal name is not valid"); @@ -114,23 +106,28 @@ public: const QMetaObject * const mo = obj->metaObject(); const QMetaMethod signalMetaMethod = QMetaMethod::fromSignal(signal0); const int sigIndex = signalMetaMethod.methodIndex(); - if (!signalMetaMethod.isValid() || - signalMetaMethod.methodType() != QMetaMethod::Signal) { - qWarning("QSignalSpy: Not a valid signal: '%s'", - signalMetaMethod.methodSignature().constData()); + + if (!isSignalMetaMethodValid(signalMetaMethod)) return; - } - if (!QMetaObject::connect(obj, sigIndex, this, memberOffset, - Qt::DirectConnection, 0)) { - qWarning("QSignalSpy: QMetaObject::connect returned false. Unable to connect."); + if (!connectToSignal(obj, sigIndex)) return; - } + sig = signalMetaMethod.methodSignature(); initArgs(mo->method(sigIndex), obj); } #endif // Q_CLANG_QDOC + QSignalSpy(const QObject *obj, const QMetaMethod &signal) + : m_waiting(false) + { + if (isObjectValid(obj) && isSignalMetaMethodValid(signal) && + connectToSignal(obj, signal.methodIndex())) { + sig = signal.methodSignature(); + initArgs(signal, obj); + } + } + inline bool isValid() const { return !sig.isEmpty(); } inline QByteArray signal() const { return sig; } @@ -160,6 +157,38 @@ public: } private: + bool connectToSignal(const QObject *sender, int sigIndex) + { + static const int memberOffset = QObject::staticMetaObject.methodCount(); + const bool connected = QMetaObject::connect( + sender, sigIndex, this, memberOffset, Qt::DirectConnection, nullptr); + + if (!connected) + qWarning("QSignalSpy: QMetaObject::connect returned false. Unable to connect."); + + return connected; + } + + static bool isSignalMetaMethodValid(const QMetaMethod &signal) + { + const bool valid = signal.isValid() && signal.methodType() == QMetaMethod::Signal; + + if (!valid) + qWarning("QSignalSpy: Not a valid signal: '%s'", signal.methodSignature().constData()); + + return valid; + } + + static bool isObjectValid(const QObject *object) + { + const bool valid = !!object; + + if (!valid) + qWarning("QSignalSpy: Cannot spy on a null object"); + + return valid; + } + void initArgs(const QMetaMethod &member, const QObject *obj) { args.reserve(member.parameterCount()); |