diff options
-rw-r--r-- | src/testlib/qsignalspy.cpp | 47 | ||||
-rw-r--r-- | src/testlib/qsignalspy.h | 33 |
2 files changed, 49 insertions, 31 deletions
diff --git a/src/testlib/qsignalspy.cpp b/src/testlib/qsignalspy.cpp index 5fd61d42dcd..a45ca59378e 100644 --- a/src/testlib/qsignalspy.cpp +++ b/src/testlib/qsignalspy.cpp @@ -110,10 +110,6 @@ QT_BEGIN_NAMESPACE Returns the normalized signal the spy is currently listening to. */ -/*! \fn int QSignalSpy::qt_metacall(QMetaObject::Call call, int id, void **a) - \internal -*/ - /*! \fn bool QSignalSpy::wait(int timeout) \since 5.0 @@ -244,22 +240,42 @@ QList<int> QSignalSpy::makeArgs(const QMetaMethod &member, const QObject *obj) return result; } -void QSignalSpy::init(ObjectSignal os) +class QSignalSpyPrivate : public QObject +{ + QSignalSpy * const q; +public: + explicit QSignalSpyPrivate(QSignalSpy *qq) : q(qq) {} + + int qt_metacall(QMetaObject::Call call, int methodId, void **a) override; +}; + +QSignalSpy::QSignalSpy(ObjectSignal os) + : args(os.obj ? makeArgs(os.sig, os.obj) : QList<int>{}) { if (!os.obj) return; + auto i = std::make_unique<QSignalSpyPrivate>(this); + const auto signalIndex = os.sig.methodIndex(); const auto slotIndex = QObject::staticMetaObject.methodCount(); if (!QMetaObject::connect(os.obj, signalIndex, - this, slotIndex, Qt::DirectConnection)) { + i.get(), slotIndex, Qt::DirectConnection)) { qWarning("QSignalSpy: QMetaObject::connect returned false. Unable to connect."); return; } + d_ptr = std::move(i); + sig = os.sig.methodSignature(); } +/*! + Destructor. +*/ +QSignalSpy::~QSignalSpy() + = default; + void QSignalSpy::appendArgs(void **a) { QList<QVariant> list; @@ -280,4 +296,23 @@ void QSignalSpy::appendArgs(void **a) } } +/*! + \reimp + \internal +*/ +int QSignalSpyPrivate::qt_metacall(QMetaObject::Call call, int methodId, void **a) +{ + methodId = QObject::qt_metacall(call, methodId, a); + if (methodId < 0) + return methodId; + + if (call == QMetaObject::InvokeMetaMethod) { + if (methodId == 0) { + q->appendArgs(a); + } + --methodId; + } + return methodId; +} + QT_END_NAMESPACE diff --git a/src/testlib/qsignalspy.h b/src/testlib/qsignalspy.h index f4c322ae718..591545b4d5d 100644 --- a/src/testlib/qsignalspy.h +++ b/src/testlib/qsignalspy.h @@ -6,24 +6,26 @@ #include <QtCore/qbytearray.h> #include <QtCore/qlist.h> -#include <QtCore/qobject.h> #include <QtCore/qmetaobject.h> #include <QtTest/qtesteventloop.h> #include <QtCore/qvariant.h> #include <QtCore/qmutex.h> +#include <memory> + QT_BEGIN_NAMESPACE class QVariant; - -class QSignalSpy: public QObject, public QList<QList<QVariant> > +class QSignalSpyPrivate; +class QSignalSpy : public QList<QList<QVariant> > { struct ObjectSignal { const QObject *obj; QMetaMethod sig; }; - + friend class QSignalSpyPrivate; + std::unique_ptr<QSignalSpyPrivate> d_ptr; public: explicit QSignalSpy(const QObject *obj, const char *aSignal) : QSignalSpy(verify(obj, aSignal)) {} @@ -37,6 +39,7 @@ public: #endif // Q_QDOC QSignalSpy(const QObject *obj, QMetaMethod signal) : QSignalSpy(verify(obj, signal)) {} + Q_TESTLIB_EXPORT ~QSignalSpy(); inline bool isValid() const { return !sig.isEmpty(); } inline QByteArray signal() const { return sig; } @@ -46,28 +49,8 @@ public: Q_TESTLIB_EXPORT bool wait(std::chrono::milliseconds timeout = std::chrono::seconds{5}); - int qt_metacall(QMetaObject::Call call, int methodId, void **a) override - { - methodId = QObject::qt_metacall(call, methodId, a); - if (methodId < 0) - return methodId; - - if (call == QMetaObject::InvokeMetaMethod) { - if (methodId == 0) { - appendArgs(a); - } - --methodId; - } - return methodId; - } - private: - explicit QSignalSpy(ObjectSignal os) - : args(os.obj ? makeArgs(os.sig, os.obj) : QList<int>{}) - { - init(os); - } - Q_TESTLIB_EXPORT void init(ObjectSignal os); + Q_TESTLIB_EXPORT explicit QSignalSpy(ObjectSignal os); Q_TESTLIB_EXPORT static ObjectSignal verify(const QObject *obj, QMetaMethod signal); Q_TESTLIB_EXPORT static ObjectSignal verify(const QObject *obj, const char *aSignal); |