diff options
Diffstat (limited to 'src/testlib/qsignalspy.h')
-rw-r--r-- | src/testlib/qsignalspy.h | 57 |
1 files changed, 46 insertions, 11 deletions
diff --git a/src/testlib/qsignalspy.h b/src/testlib/qsignalspy.h index 72a5df1ed9..3ce1c6f99b 100644 --- a/src/testlib/qsignalspy.h +++ b/src/testlib/qsignalspy.h @@ -98,6 +98,48 @@ public: initArgs(mo->method(sigIndex), obj); } +#ifdef Q_QDOC + QSignalSpy(const QObject *object, PointerToMemberFunction signal); +#else + template <typename Func> + QSignalSpy(const typename QtPrivate::FunctionPointer<Func>::Object *obj, Func signal0) + : m_waiting(false) + { +#ifdef Q_CC_BOR + const int memberOffset = QObject::staticMetaObject.methodCount(); +#else + static const int memberOffset = QObject::staticMetaObject.methodCount(); +#endif + if (!obj) { + qWarning("QSignalSpy: Cannot spy on a null object"); + return; + } + + if (!signal0) { + qWarning("QSignalSpy: Null signal name is not valid"); + return; + } + + 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()); + return; + } + + if (!QMetaObject::connect(obj, sigIndex, this, memberOffset, + Qt::DirectConnection, 0)) { + qWarning("QSignalSpy: QMetaObject::connect returned false. Unable to connect."); + return; + } + sig = signalMetaMethod.methodSignature(); + initArgs(mo->method(sigIndex), obj); + } +#endif // Q_QDOC + inline bool isValid() const { return !sig.isEmpty(); } inline QByteArray signal() const { return sig; } @@ -127,17 +169,11 @@ public: } private: - void initArgs(const QMetaMethod &member) - { - initArgs(member, 0); - } - void initArgs(const QMetaMethod &member, const QObject *obj) { - const QList<QByteArray> params = member.parameterTypes(); - args.reserve(params.size()); - for (int i = 0; i < params.count(); ++i) { - int tp = QMetaType::type(params.at(i).constData()); + args.reserve(member.parameterCount()); + for (int i = 0; i < member.parameterCount(); ++i) { + int tp = member.parameterType(i); if (tp == QMetaType::UnknownType && obj) { void *argv[] = { &tp, &i }; QMetaObject::metacall(const_cast<QObject*>(obj), @@ -147,9 +183,8 @@ private: tp = QMetaType::UnknownType; } if (tp == QMetaType::UnknownType) { - Q_ASSERT(tp != QMetaType::Void); // void parameter => metaobject is corrupt qWarning("Don't know how to handle '%s', use qRegisterMetaType to register it.", - params.at(i).constData()); + member.parameterNames().at(i).constData()); } args << tp; } |