From 6fc7d76e7309c01a364b0f72d253735366674f29 Mon Sep 17 00:00:00 2001 From: Keith Gardner Date: Wed, 16 Apr 2014 20:43:56 -0500 Subject: QSignalSpy: Added template function pointer constructor Added the function pointer constructor to QSignalSpy to take advantage of the new connect syntax. Change-Id: I94218a096c677cdba73e1b2cfa8b9c09bc28145f Reviewed-by: Olivier Goffart Reviewed-by: Jason McDonald --- .../doc/snippets/code/doc_src_qsignalspy.cpp | 5 +++ src/testlib/qsignalspy.h | 42 ++++++++++++++++++++++ src/testlib/qsignalspy.qdoc | 14 ++++++++ 3 files changed, 61 insertions(+) (limited to 'src/testlib') diff --git a/src/testlib/doc/snippets/code/doc_src_qsignalspy.cpp b/src/testlib/doc/snippets/code/doc_src_qsignalspy.cpp index e4702c6e0b..0856de9450 100644 --- a/src/testlib/doc/snippets/code/doc_src_qsignalspy.cpp +++ b/src/testlib/doc/snippets/code/doc_src_qsignalspy.cpp @@ -83,3 +83,8 @@ QSignalSpy spy(myPushButton, SIGNAL(clicked(bool))); //! [5] QVERIFY(spy.wait(1000)); //! [5] + +//! [6] +QSignalSpy spy(myPushButton, &QPushButton::clicked); +//! [6] + diff --git a/src/testlib/qsignalspy.h b/src/testlib/qsignalspy.h index 72a5df1ed9..a8a776aff0 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 + QSignalSpy(const typename QtPrivate::FunctionPointer::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; } diff --git a/src/testlib/qsignalspy.qdoc b/src/testlib/qsignalspy.qdoc index 9559090e8f..31cdeaba6a 100644 --- a/src/testlib/qsignalspy.qdoc +++ b/src/testlib/qsignalspy.qdoc @@ -72,6 +72,20 @@ \snippet code/doc_src_qsignalspy.cpp 4 */ +/*! \fn QSignalSpy::QSignalSpy(const QObject *object, PointerToMemberFunction signal) + \since 5.4 + + Constructs a new QSignalSpy that listens for emissions of the \a signal + from the QObject \a object. If QSignalSpy is not able to listen for a + valid signal (for example, because \a object is null or \a signal does + not denote a valid signal of \a object), an explanatory warning message + will be output using qWarning() and subsequent calls to \c isValid() will + return false. + + Example: + \snippet code/doc_src_qsignalspy.cpp 6 +*/ + /*! \fn QSignalSpy::isValid() const Returns \c true if the signal spy listens to a valid signal, otherwise false. -- cgit v1.2.3