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