Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qsignaldumper.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include <QtTest/private/qsignaldumper_p.h>
5
6#include <QtCore/qlist.h>
7#include <QtCore/qmetaobject.h>
8#include <QtCore/qmetatype.h>
9#include <QtCore/qobject.h>
10#include <QtCore/qvariant.h>
11
12#include <QtTest/private/qtestlog_p.h>
13
14#include <QtCore/private/qmetaobject_p.h>
15
17
18namespace QTest
19{
20
21inline static void qPrintMessage(const QByteArray &ba)
22{
23 QTestLog::info(ba.constData(), nullptr, 0);
24}
25
27static int iLevel = 0;
28static int ignoreLevel = 0;
29enum { IndentSpacesCount = 4 };
30
31static void qSignalDumperCallback(QObject *caller, int signal_index, void **argv)
32{
33 Q_ASSERT(caller);
34 Q_ASSERT(argv);
35 Q_UNUSED(argv);
36 const QMetaObject *mo = caller->metaObject();
37 Q_ASSERT(mo);
38 QMetaMethod member = QMetaObjectPrivate::signal(mo, signal_index);
39 Q_ASSERT(member.isValid());
40
41 if (QTest::ignoreClasses() && QTest::ignoreClasses()->contains(mo->className())) {
43 return;
44 }
45
48 str += "Signal: ";
49 str += mo->className();
50 str += '(';
51
52 QString objname = caller->objectName();
53 str += objname.toLocal8Bit();
54 if (!objname.isEmpty())
55 str += ' ';
56 str += QByteArray::number(quintptr(caller), 16).rightJustified(8, '0');
57
58 str += ") ";
59 str += member.name();
60 str += " (";
61
63 for (int i = 0; i < args.size(); ++i) {
64 const QByteArray &arg = args.at(i);
65 int typeId = QMetaType::fromName(args.at(i).constData()).id();
66 if (arg.endsWith('*') || arg.endsWith('&')) {
67 str += '(';
68 str += arg;
69 str += ')';
70 if (arg.endsWith('&'))
71 str += '@';
72
73 quintptr addr = quintptr(*reinterpret_cast<void **>(argv[i + 1]));
74 str.append(QByteArray::number(addr, 16).rightJustified(8, '0'));
75 } else if (typeId != QMetaType::UnknownType) {
76 Q_ASSERT(typeId != QMetaType::Void); // void parameter => metaobject is corrupt
78 .append('(')
79 .append(QVariant(QMetaType(typeId), argv[i + 1]).toString().toLocal8Bit())
80 .append(')');
81 }
82 str.append(", ");
83 }
84 if (str.endsWith(", "))
85 str.chop(2);
86 str.append(')');
88}
89
90static void qSignalDumperCallbackSlot(QObject *caller, int method_index, void **argv)
91{
92 Q_ASSERT(caller);
93 Q_ASSERT(argv);
94 Q_UNUSED(argv);
95 const QMetaObject *mo = caller->metaObject();
96 Q_ASSERT(mo);
97 QMetaMethod member = mo->method(method_index);
98 if (!member.isValid())
99 return;
100
101 if (QTest::ignoreLevel ||
102 (QTest::ignoreClasses() && QTest::ignoreClasses()->contains(mo->className())))
103 return;
104
107 str += "Slot: ";
108 str += mo->className();
109 str += '(';
110
111 QString objname = caller->objectName();
112 str += objname.toLocal8Bit();
113 if (!objname.isEmpty())
114 str += ' ';
115 str += QByteArray::number(quintptr(caller), 16).rightJustified(8, '0');
116
117 str += ") ";
118 str += member.methodSignature();
120}
121
122static void qSignalDumperCallbackEndSignal(QObject *caller, int /*signal_index*/)
123{
124 Q_ASSERT(caller); Q_ASSERT(caller->metaObject());
125 if (QTest::ignoreClasses()
126 && QTest::ignoreClasses()->contains(caller->metaObject()->className())) {
129 return;
130 }
133}
134
135}
136
138{
139 s_isEnabled = enabled;
140}
141
143{
144 if (!s_isEnabled)
145 return;
146
150}
151
153{
155}
156
158{
159 if (QTest::ignoreClasses())
160 QTest::ignoreClasses()->append(klass);
161}
162
164{
165 if (QTest::ignoreClasses())
166 QTest::ignoreClasses()->clear();
167}
168
169bool QSignalDumper::s_isEnabled = false;
170
\inmodule QtCore
Definition qbytearray.h:57
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
Definition qbytearray.h:122
static QByteArray number(int, int base=10)
Returns a byte-array representing the whole number n as text.
QByteArray rightJustified(qsizetype width, char fill=' ', bool truncate=false) const
Returns a byte array of size width that contains the fill byte followed by this byte array.
Definition qlist.h:74
qsizetype size() const noexcept
Definition qlist.h:386
const_reference at(qsizetype i) const noexcept
Definition qlist.h:429
\inmodule QtCore
Definition qmetaobject.h:18
bool isValid() const
QList< QByteArray > parameterTypes() const
Returns a list of parameter types.
QByteArray methodSignature() const
QByteArray name() const
\inmodule QtCore
Definition qmetatype.h:320
static QMetaType fromName(QByteArrayView name)
Returns a QMetaType matching typeName.
int id(int=0) const
Definition qmetatype.h:454
\inmodule QtCore
Definition qobject.h:90
QString objectName
the name of this object
Definition qobject.h:94
static void ignoreClass(const QByteArray &klass)
static void endDump()
static void startDump()
static void setEnabled(bool)
static void clearIgnoredClasses()
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
QString & fill(QChar c, qsizetype size=-1)
Sets every character in the string to character ch.
Definition qstring.cpp:6198
void chop(qsizetype n)
Removes n characters from the end of the string.
Definition qstring.cpp:6180
bool endsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string ends with s; otherwise returns false.
Definition qstring.cpp:5350
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:1083
QByteArray toLocal8Bit() const &
Definition qstring.h:567
QString & append(QChar c)
Definition qstring.cpp:3227
static void info(const char *msg, const char *file, int line)
Definition qtestlog.cpp:580
\inmodule QtCore
Definition qvariant.h:64
QString str
[2]
auto mo
[7]
Combined button and popup list for selecting options.
static void qSignalDumperCallback(QObject *caller, int signal_index, void **argv)
static int ignoreLevel
static int iLevel
char * toString(const MyPoint &point)
static void qPrintMessage(const QByteArray &ba)
static void qSignalDumperCallbackSlot(QObject *caller, int method_index, void **argv)
@ IndentSpacesCount
static void qSignalDumperCallbackEndSignal(QObject *caller, int)
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
void qt_register_signal_spy_callbacks(QSignalSpyCallbackSet *callback_set)
Definition qobject.cpp:64
static bool contains(const QJsonArray &haystack, unsigned needle)
Definition qopengl.cpp:116
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLenum const void * addr
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
SSL_CTX int(*) void arg)
static char * toLocal8Bit(char *out, QStringView in, QStringConverter::State *state)
#define Q_UNUSED(x)
size_t quintptr
Definition qtypes.h:72
#define enabled
QFuture< QSet< QChar > > set
[10]
QByteArray ba
[0]
QJSValueList args
static Q_CORE_EXPORT QMetaMethod signal(const QMetaObject *m, int signal_index)
\inmodule QtCore