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