Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qmetaobject.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// Copyright (C) 2014 Olivier Goffart <ogoffart@woboq.com>
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4
5#ifndef QMETAOBJECT_H
6#define QMETAOBJECT_H
7
8#include <QtCore/qobjectdefs.h>
9#include <QtCore/qcompare.h>
10#include <QtCore/qvariant.h>
11
13
15
16#define Q_METAMETHOD_INVOKE_MAX_ARGS 10
17
18class Q_CORE_EXPORT QMetaMethod
19{
20public:
21 constexpr inline QMetaMethod() : mobj(nullptr), data({ nullptr }) {}
22
23 QByteArray methodSignature() const;
24 QByteArray name() const;
25 QByteArrayView nameView() const;
26 const char *typeName() const;
27 int returnType() const;
28 QMetaType returnMetaType() const;
29 int parameterCount() const;
30 int parameterType(int index) const;
31 QMetaType parameterMetaType(int index) const;
32 void getParameterTypes(int *types) const;
33 QList<QByteArray> parameterTypes() const;
34 QByteArray parameterTypeName(int index) const;
35 QList<QByteArray> parameterNames() const;
36 const char *tag() const;
37 enum Access { Private, Protected, Public };
38 Access access() const;
39 enum MethodType {
40 Method = QMETHOD_CODE,
41 Signal QT7_ONLY(= QSIGNAL_CODE),
42 Slot QT7_ONLY(= QSLOT_CODE),
43 Constructor = 3, // no Q*_CODE
44 };
45 MethodType methodType() const;
46 enum Attributes { Compatibility = 0x1, Cloned = 0x2, Scriptable = 0x4 };
47 int attributes() const;
48 int methodIndex() const;
49 int relativeMethodIndex() const;
50 int revision() const;
51 bool isConst() const;
52
53 inline const QMetaObject *enclosingMetaObject() const { return mobj; }
54
55#if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0)
56 bool invoke(QObject *object,
57 Qt::ConnectionType connectionType,
58 QGenericReturnArgument returnValue,
59 QGenericArgument val0 = QGenericArgument(nullptr),
60 QGenericArgument val1 = QGenericArgument(),
61 QGenericArgument val2 = QGenericArgument(),
62 QGenericArgument val3 = QGenericArgument(),
63 QGenericArgument val4 = QGenericArgument(),
64 QGenericArgument val5 = QGenericArgument(),
65 QGenericArgument val6 = QGenericArgument(),
66 QGenericArgument val7 = QGenericArgument(),
67 QGenericArgument val8 = QGenericArgument(),
68 QGenericArgument val9 = QGenericArgument()) const;
69 inline bool invoke(QObject *object,
70 QGenericReturnArgument returnValue,
71 QGenericArgument val0 = QGenericArgument(nullptr),
72 QGenericArgument val1 = QGenericArgument(),
73 QGenericArgument val2 = QGenericArgument(),
74 QGenericArgument val3 = QGenericArgument(),
75 QGenericArgument val4 = QGenericArgument(),
76 QGenericArgument val5 = QGenericArgument(),
77 QGenericArgument val6 = QGenericArgument(),
78 QGenericArgument val7 = QGenericArgument(),
79 QGenericArgument val8 = QGenericArgument(),
80 QGenericArgument val9 = QGenericArgument()) const
81 {
82 return invoke(object, Qt::AutoConnection, returnValue,
83 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
84 }
85 inline bool invoke(QObject *object,
86 Qt::ConnectionType connectionType,
87 QGenericArgument val0,
88 QGenericArgument val1 = QGenericArgument(),
89 QGenericArgument val2 = QGenericArgument(),
90 QGenericArgument val3 = QGenericArgument(),
91 QGenericArgument val4 = QGenericArgument(),
92 QGenericArgument val5 = QGenericArgument(),
93 QGenericArgument val6 = QGenericArgument(),
94 QGenericArgument val7 = QGenericArgument(),
95 QGenericArgument val8 = QGenericArgument(),
96 QGenericArgument val9 = QGenericArgument()) const
97 {
98 return invoke(object, connectionType, QGenericReturnArgument(),
99 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
100 }
101 inline bool invoke(QObject *object,
102 QGenericArgument val0,
103 QGenericArgument val1 = QGenericArgument(),
104 QGenericArgument val2 = QGenericArgument(),
105 QGenericArgument val3 = QGenericArgument(),
106 QGenericArgument val4 = QGenericArgument(),
107 QGenericArgument val5 = QGenericArgument(),
108 QGenericArgument val6 = QGenericArgument(),
109 QGenericArgument val7 = QGenericArgument(),
110 QGenericArgument val8 = QGenericArgument(),
111 QGenericArgument val9 = QGenericArgument()) const
112 {
113 return invoke(object, Qt::AutoConnection, QGenericReturnArgument(),
114 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
115 }
116 bool invokeOnGadget(void *gadget,
117 QGenericReturnArgument returnValue,
118 QGenericArgument val0 = QGenericArgument(nullptr),
119 QGenericArgument val1 = QGenericArgument(),
120 QGenericArgument val2 = QGenericArgument(),
121 QGenericArgument val3 = QGenericArgument(),
122 QGenericArgument val4 = QGenericArgument(),
123 QGenericArgument val5 = QGenericArgument(),
124 QGenericArgument val6 = QGenericArgument(),
125 QGenericArgument val7 = QGenericArgument(),
126 QGenericArgument val8 = QGenericArgument(),
127 QGenericArgument val9 = QGenericArgument()) const;
128 inline bool invokeOnGadget(void *gadget,
129 QGenericArgument val0,
130 QGenericArgument val1 = QGenericArgument(),
131 QGenericArgument val2 = QGenericArgument(),
132 QGenericArgument val3 = QGenericArgument(),
133 QGenericArgument val4 = QGenericArgument(),
134 QGenericArgument val5 = QGenericArgument(),
135 QGenericArgument val6 = QGenericArgument(),
136 QGenericArgument val7 = QGenericArgument(),
137 QGenericArgument val8 = QGenericArgument(),
138 QGenericArgument val9 = QGenericArgument()) const
139 {
140 return invokeOnGadget(gadget, QGenericReturnArgument(),
141 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
142 }
143#endif
144
145 template <typename ReturnArg, typename... Args>
146#ifdef Q_QDOC
147 bool
148#else
149 QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
150#endif
151 invoke(QObject *obj, Qt::ConnectionType c, QTemplatedMetaMethodReturnArgument<ReturnArg> r,
152 Args &&... arguments) const
153 {
154 auto h = QtPrivate::invokeMethodHelper(r, std::forward<Args>(arguments)...);
155 return invokeImpl(*this, obj, c, h.parameterCount(), h.parameters.data(),
156 h.typeNames.data(), h.metaTypes.data());
157 }
158
159 template <typename... Args>
160#ifdef Q_QDOC
161 bool
162#else
163 QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
164#endif
165 invoke(QObject *obj, Qt::ConnectionType c, Args &&... arguments) const
166 {
167 return invoke(obj, c, QTemplatedMetaMethodReturnArgument<void>{}, std::forward<Args>(arguments)...);
168 }
169
170 template <typename ReturnArg, typename... Args>
171#ifdef Q_QDOC
172 bool
173#else
174 QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
175#endif
176 invoke(QObject *obj, QTemplatedMetaMethodReturnArgument<ReturnArg> r, Args &&... arguments) const
177 {
178 return invoke(obj, Qt::AutoConnection, r, std::forward<Args>(arguments)...);
179 }
180
181 template <typename... Args>
182#ifdef Q_QDOC
183 bool
184#else
185 QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
186#endif
187 invoke(QObject *obj, Args &&... arguments) const
188 {
189 return invoke(obj, Qt::AutoConnection, std::forward<Args>(arguments)...);
190 }
191
192 template <typename ReturnArg, typename... Args>
193#ifdef Q_QDOC
194 bool
195#else
196 QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
197#endif
198 invokeOnGadget(void *gadget, QTemplatedMetaMethodReturnArgument<ReturnArg> r, Args &&... arguments) const
199 {
200 auto h = QtPrivate::invokeMethodHelper(r, std::forward<Args>(arguments)...);
201 return invokeImpl(*this, gadget, Qt::ConnectionType(-1), h.parameterCount(),
202 h.parameters.data(), h.typeNames.data(), h.metaTypes.data());
203 }
204
205 template <typename... Args>
206#ifdef Q_QDOC
207 bool
208#else
209 QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
210#endif
211 invokeOnGadget(void *gadget, Args &&... arguments) const
212 {
213 return invokeOnGadget(gadget, QTemplatedMetaMethodReturnArgument<void>{}, std::forward<Args>(arguments)...);
214 }
215
216 inline bool isValid() const { return mobj != nullptr; }
217
218 template <typename PointerToMemberFunction>
219 static inline QMetaMethod fromSignal(PointerToMemberFunction signal)
220 {
221 typedef QtPrivate::FunctionPointer<PointerToMemberFunction> SignalType;
222 static_assert(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,
223 "No Q_OBJECT in the class with the signal");
224 return fromSignalImpl(&SignalType::Object::staticMetaObject,
225 reinterpret_cast<void **>(&signal));
226 }
227
228private:
229 static bool invokeImpl(QMetaMethod self, void *target, Qt::ConnectionType, qsizetype paramCount,
230 const void *const *parameters, const char *const *typeNames,
231 const QtPrivate::QMetaTypeInterface *const *metaTypes);
232 static QMetaMethod fromSignalImpl(const QMetaObject *, void **);
233 static QMetaMethod fromRelativeMethodIndex(const QMetaObject *mobj, int index);
234 static QMetaMethod fromRelativeConstructorIndex(const QMetaObject *mobj, int index);
235
236protected:
237 struct Data {
238 enum { Size = 6 };
239
240 uint name() const { return d[0]; }
241 uint argc() const { return d[1]; }
242 uint parameters() const { return d[2]; }
243 uint tag() const { return d[3]; }
244 uint flags() const { return d[4]; }
245 uint metaTypeOffset() const { return d[5]; }
246 bool operator==(const Data &other) const { return d == other.d; }
247
248 const uint *d;
249 };
250private:
251 constexpr QMetaMethod(const QMetaObject *metaObject, const Data &data_)
252 : mobj(metaObject), data(data_)
253 {}
254protected:
255
256 const QMetaObject *mobj;
257 Data data;
258 friend struct QMetaObject;
259 friend struct QMetaObjectPrivate;
260 friend class QObject;
261
262private:
263 friend bool comparesEqual(const QMetaMethod &lhs, const QMetaMethod &rhs) noexcept
264 { return lhs.data == rhs.data; }
265 Q_DECLARE_EQUALITY_COMPARABLE(QMetaMethod)
266};
267Q_DECLARE_TYPEINFO(QMetaMethod, Q_RELOCATABLE_TYPE);
268
269class Q_CORE_EXPORT QMetaEnum
270{
271public:
272 constexpr inline QMetaEnum() : mobj(nullptr), data({ nullptr }) {}
273
274 const char *name() const;
275 const char *enumName() const;
276 QMetaType metaType() const;
277
278 bool isFlag() const;
279 bool isScoped() const;
280 bool is64Bit() const;
281
282 int keyCount() const;
283 const char *key(int index) const;
284 int value(int index) const;
285 std::optional<quint64> value64(int index) const;
286
287 const char *scope() const;
288
289 int keyToValue(const char *key, bool *ok = nullptr) const;
290 int keysToValue(const char *keys, bool *ok = nullptr) const;
291 std::optional<quint64> keyToValue64(const char *key) const;
292 std::optional<quint64> keysToValue64(const char *keys) const;
293#if QT_CORE_REMOVED_SINCE(6, 9)
294 const char *valueToKey(int value) const;
295 QByteArray valueToKeys(int value) const;
296#endif
297 const char *valueToKey(quint64 value) const;
298 QByteArray valueToKeys(quint64 value) const;
299
300 inline const QMetaObject *enclosingMetaObject() const { return mobj; }
301
302 inline bool isValid() const { return name() != nullptr; }
303
304 template<typename T>
305 static QMetaEnum fromType()
306 {
307 static_assert(QtPrivate::IsQEnumHelper<T>::Value,
308 "QMetaEnum::fromType only works with enums declared as "
309 "Q_ENUM, Q_ENUM_NS, Q_FLAG or Q_FLAG_NS");
310 const QMetaObject *metaObject = qt_getEnumMetaObject(T());
311 const char *name = qt_getEnumName(T());
312 return metaObject->enumerator(metaObject->indexOfEnumerator(name));
313 }
314
315private:
316 struct Data {
317 enum { Size = 5 };
318 quint32 name() const { return d[0]; }
319 quint32 alias() const { return d[1]; }
320 quint32 flags() const { return d[2]; }
321 qint32 keyCount() const { return static_cast<qint32>(d[3]); }
322 quint32 data() const { return d[4]; }
323 int index(const QMetaObject *mobj) const;
324
325 const uint *d;
326 };
327
328 QMetaEnum(const QMetaObject *mobj, int index);
329 template <typename... Args> quint64 value_helper(uint index, Args...) const noexcept;
330
331 const QMetaObject *mobj;
332 Data data;
333 friend struct QMetaObject;
334 friend struct QMetaObjectPrivate;
335};
336Q_DECLARE_TYPEINFO(QMetaEnum, Q_RELOCATABLE_TYPE);
337
338class Q_CORE_EXPORT QMetaProperty
339{
340public:
341 constexpr QMetaProperty() : mobj(nullptr), data({ nullptr }) {}
342
343 const char *name() const;
344 const char *typeName() const;
345#if QT_DEPRECATED_SINCE(6, 0)
346 QT_WARNING_PUSH
347 QT_WARNING_DISABLE_DEPRECATED
348 QT_DEPRECATED_VERSION_6_0
349 QVariant::Type type() const
350 { int t = userType(); return t >= QMetaType::User ? QVariant::UserType : QVariant::Type(t); }
351 QT_WARNING_POP
352#endif
353 int userType() const { return typeId(); }
354 int typeId() const { return metaType().id(); }
355 QMetaType metaType() const;
356 int propertyIndex() const;
357 int relativePropertyIndex() const;
358
359 bool isReadable() const;
360 bool isWritable() const;
361 bool isResettable() const;
362 bool isDesignable() const;
363 bool isScriptable() const;
364 bool isStored() const;
365 bool isUser() const;
366 bool isConstant() const;
367 bool isFinal() const;
368 bool isRequired() const;
369 bool isBindable() const;
370
371 bool isFlagType() const;
372 bool isEnumType() const;
373 QMetaEnum enumerator() const;
374
375 bool hasNotifySignal() const;
376 QMetaMethod notifySignal() const;
377 int notifySignalIndex() const;
378
379 int revision() const;
380
381 QVariant read(const QObject *obj) const;
382 bool write(QObject *obj, const QVariant &value) const;
383 bool write(QObject *obj, QVariant &&value) const;
384 bool reset(QObject *obj) const;
385
386 QUntypedBindable bindable(QObject *object) const;
387
388 QVariant readOnGadget(const void *gadget) const;
389 bool writeOnGadget(void *gadget, const QVariant &value) const;
390 bool writeOnGadget(void *gadget, QVariant &&value) const;
391 bool resetOnGadget(void *gadget) const;
392
393 bool hasStdCppSet() const;
394 bool isAlias() const;
395 inline bool isValid() const { return isReadable(); }
396 inline const QMetaObject *enclosingMetaObject() const { return mobj; }
397
398private:
399#if QT_DEPRECATED_SINCE(6, 4)
400 QT_DEPRECATED_VERSION_X_6_4("obsolete, simply returns typeId()")
401 int registerPropertyType() const;
402#endif
403
404 struct Data {
405 enum { Size = 5 };
406
407 uint name() const { return d[0]; }
408 uint type() const { return d[1]; }
409 uint flags() const { return d[2]; }
410 uint notifyIndex() const { return d[3]; }
411 uint revision() const { return d[4]; }
412
413 int index(const QMetaObject *mobj) const;
414
415 const uint *d;
416 };
417
418 QMetaProperty(const QMetaObject *mobj, int index);
419 static Data getMetaPropertyData(const QMetaObject *mobj, int index);
420
421 const QMetaObject *mobj;
422 Data data;
423 QMetaEnum menum;
424 friend struct QMetaObject;
425 friend struct QMetaObjectPrivate;
426};
427
428class Q_CORE_EXPORT QMetaClassInfo
429{
430public:
431 constexpr inline QMetaClassInfo() : mobj(nullptr), data({ nullptr }) {}
432 const char *name() const;
433 const char *value() const;
434 inline const QMetaObject *enclosingMetaObject() const { return mobj; }
435
436private:
437 struct Data {
438 enum { Size = 2 };
439
440 uint name() const { return d[0]; }
441 uint value() const { return d[1]; }
442
443 const uint *d;
444 };
445
446 const QMetaObject *mobj;
447 Data data;
448 friend struct QMetaObject;
449};
450Q_DECLARE_TYPEINFO(QMetaClassInfo, Q_RELOCATABLE_TYPE);
451
452QT_END_NAMESPACE
453
454#endif // QMETAOBJECT_H
const QTextStreamPrivate::Params m_streamParams
Definition qdebug.cpp:1385
QDebugStateSaverPrivate(QDebug::Stream *stream)
Definition qdebug.cpp:1353
\inmodule QtCore
\inmodule QtCore
\inmodule QtCore
Definition qmetaobject.h:19
\inmodule QtCore
\inmodule QtCore
Definition qproperty.h:730
Q_DECLARE_TYPEINFO(QByteArrayView, Q_PRIMITIVE_TYPE)
QDebug qt_QMetaEnum_debugOperator(QDebug &dbg, qint64 value, const QMetaObject *meta, const char *name)
Definition qdebug.cpp:1470
static void putEscapedString(QTextStreamPrivate *d, const Char *begin, size_t length, bool isUnicode=true)
Definition qdebug.cpp:200
static bool isPrintable(char16_t uc)
Definition qdebug.cpp:195
static QByteArray timeUnit(qint64 num, qint64 den)
Definition qdebug.cpp:351
static bool isPrintable(uchar c)
Definition qdebug.cpp:196
static bool isPrintable(char32_t ucs4)
Definition qdebug.cpp:194
void qt_QMetaEnum_flagDebugOperator(QDebug &debug, size_t sizeofT, uint value)
Definition qdebug.cpp:1419