summaryrefslogtreecommitdiffstats
path: root/src/testlib/qsignalspy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/testlib/qsignalspy.cpp')
-rw-r--r--src/testlib/qsignalspy.cpp50
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