9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
55
56
57
58
59
60
61
62
63
64
65
68
69
70
71
72
73
74
75
76
77
78
79
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
104
105
106
109
110
111
114
115
116
117
118
119
120
121
122
123
124
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
147 QMutexLocker locker(&m_mutex);
148 Q_ASSERT(!m_waiting);
149 const qsizetype origCount = size();
153 m_loop.enterLoop(timeout);
157 return size() > origCount;
162 if (!signal.isValid()) {
163 qWarning(
"QSignalSpy: Null signal is not valid");
167 if (signal.methodType() != QMetaMethod::Signal) {
168 qWarning(
"QSignalSpy: Not a signal: '%s'", signal.methodSignature().constData());
177 const bool valid = !!object;
180 qWarning(
"QSignalSpy: Cannot spy on a null object");
185QSignalSpy::ObjectSignal
QSignalSpy::verify(
const QObject *obj,
const char *aSignal)
187 if (!isObjectValid(obj))
191 qWarning(
"QSignalSpy: Null signal name is not valid");
195 if (((aSignal[0] -
'0') & 0x03) != QSIGNAL_CODE) {
196 qWarning(
"QSignalSpy: Not a valid signal, use the SIGNAL macro");
200 const QByteArray ba = QMetaObject::normalizedSignature(aSignal + 1);
201 const QMetaObject *
const mo = obj->metaObject();
202 const int sigIndex = mo->indexOfMethod(ba.constData());
204 qWarning(
"QSignalSpy: No such signal: '%s'", ba.constData());
208 return verify(obj, mo->method(sigIndex));
211QSignalSpy::ObjectSignal
QSignalSpy::verify(
const QObject *obj, QMetaMethod signal)
213 if (isObjectValid(obj) && isSignalMetaMethodValid(signal))
214 return {obj, signal};
222 result.reserve(member.parameterCount());
223 for (
int i = 0; i < member.parameterCount(); ++i) {
224 QMetaType tp = member.parameterMetaType(i);
226 qWarning(
"QSignalSpy: Unable to handle parameter '%s' of type '%s' of method '%s',"
227 " use qRegisterMetaType to register it.",
228 member.parameterNames().at(i).constData(),
229 member.parameterTypes().at(i).constData(),
230 member.name().constData());
232 result.append(tp.id());
243 int qt_metacall(QMetaObject::Call call,
int methodId,
void **a)
override;
247 : sig(os.sig.methodSignature()),
248 args(os.obj ? makeArgs(os.sig) : QList<
int>{})
255 const auto signalIndex = os.sig.methodIndex();
256 const auto slotIndex = QObject::staticMetaObject.methodCount();
257 if (!QMetaObject::connect(os.obj, signalIndex,
258 i.get(), slotIndex, Qt::DirectConnection)) {
259 qWarning(
"QSignalSpy: QMetaObject::connect returned false. Unable to connect.");
263 d_ptr = std::move(i);
267
268
274 QList<QVariant> list;
275 list.reserve(args.size());
276 for (qsizetype i = 0; i < args.size(); ++i) {
277 const QMetaType::Type type =
static_cast<QMetaType::Type>(args.at(i));
278 if (type == QMetaType::QVariant)
279 list << *
reinterpret_cast<QVariant *>(a[i + 1]);
281 list << QVariant(QMetaType(type), a[i + 1]);
283 QMutexLocker locker(&m_mutex);
284 append(
std::move(list));
293
294
295
298 methodId = QObject::qt_metacall(call, methodId, a);
302 if (call == QMetaObject::InvokeMetaMethod) {
QSignalSpyPrivate(QSignalSpy *qq)
int qt_metacall(QMetaObject::Call call, int methodId, void **a) override
\reimp
Q_TESTLIB_EXPORT ~QSignalSpy()
Destructor.
Combined button and popup list for selecting options.
static bool isSignalMetaMethodValid(QMetaMethod signal)
static bool isObjectValid(const QObject *object)
static QList< int > makeArgs(QMetaMethod member)