diff options
Diffstat (limited to 'src/testlib/qsignalspy.cpp')
-rw-r--r-- | src/testlib/qsignalspy.cpp | 50 |
1 files changed, 42 insertions, 8 deletions
diff --git a/src/testlib/qsignalspy.cpp b/src/testlib/qsignalspy.cpp index 5fd61d42dc..116ce87c3e 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 @@ -220,7 +216,7 @@ QSignalSpy::ObjectSignal QSignalSpy::verify(const QObject *obj, QMetaMethod sign return {}; } -QList<int> QSignalSpy::makeArgs(const QMetaMethod &member, const QObject *obj) +static QList<int> makeArgs(QMetaMethod member, const QObject *obj) { QList<int> result; result.reserve(member.parameterCount()); @@ -244,22 +240,41 @@ 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) + : sig(os.sig.methodSignature()), + 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; } - sig = os.sig.methodSignature(); + d_ptr = std::move(i); } +/*! + Destructor. +*/ +QSignalSpy::~QSignalSpy() + = default; + void QSignalSpy::appendArgs(void **a) { QList<QVariant> list; @@ -280,4 +295,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 |