File indexing completed on 2025-12-15 10:24:21
0001
0002
0003
0004
0005 #ifndef QMETAOBJECT_H
0006 #define QMETAOBJECT_H
0007
0008 #include <QtCore/qobjectdefs.h>
0009 #include <QtCore/qcompare.h>
0010 #include <QtCore/qvariant.h>
0011
0012 QT_BEGIN_NAMESPACE
0013
0014 class QUntypedBindable;
0015
0016 #define Q_METAMETHOD_INVOKE_MAX_ARGS 10
0017
0018 class Q_CORE_EXPORT QMetaMethod
0019 {
0020 public:
0021 constexpr inline QMetaMethod() : mobj(nullptr), data({ nullptr }) {}
0022
0023 QByteArray methodSignature() const;
0024 QByteArray name() const;
0025 QByteArrayView nameView() const;
0026 const char *typeName() const;
0027 int returnType() const;
0028 QMetaType returnMetaType() const;
0029 int parameterCount() const;
0030 int parameterType(int index) const;
0031 QMetaType parameterMetaType(int index) const;
0032 void getParameterTypes(int *types) const;
0033 QList<QByteArray> parameterTypes() const;
0034 QByteArray parameterTypeName(int index) const;
0035 QList<QByteArray> parameterNames() const;
0036 const char *tag() const;
0037 enum Access { Private, Protected, Public };
0038 Access access() const;
0039 enum MethodType { Method, Signal, Slot, Constructor };
0040 MethodType methodType() const;
0041 enum Attributes { Compatibility = 0x1, Cloned = 0x2, Scriptable = 0x4 };
0042 int attributes() const;
0043 int methodIndex() const;
0044 int relativeMethodIndex() const;
0045 int revision() const;
0046 bool isConst() const;
0047
0048 inline const QMetaObject *enclosingMetaObject() const { return mobj; }
0049
0050 #if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0)
0051 bool invoke(QObject *object,
0052 Qt::ConnectionType connectionType,
0053 QGenericReturnArgument returnValue,
0054 QGenericArgument val0 = QGenericArgument(nullptr),
0055 QGenericArgument val1 = QGenericArgument(),
0056 QGenericArgument val2 = QGenericArgument(),
0057 QGenericArgument val3 = QGenericArgument(),
0058 QGenericArgument val4 = QGenericArgument(),
0059 QGenericArgument val5 = QGenericArgument(),
0060 QGenericArgument val6 = QGenericArgument(),
0061 QGenericArgument val7 = QGenericArgument(),
0062 QGenericArgument val8 = QGenericArgument(),
0063 QGenericArgument val9 = QGenericArgument()) const;
0064 inline bool invoke(QObject *object,
0065 QGenericReturnArgument returnValue,
0066 QGenericArgument val0 = QGenericArgument(nullptr),
0067 QGenericArgument val1 = QGenericArgument(),
0068 QGenericArgument val2 = QGenericArgument(),
0069 QGenericArgument val3 = QGenericArgument(),
0070 QGenericArgument val4 = QGenericArgument(),
0071 QGenericArgument val5 = QGenericArgument(),
0072 QGenericArgument val6 = QGenericArgument(),
0073 QGenericArgument val7 = QGenericArgument(),
0074 QGenericArgument val8 = QGenericArgument(),
0075 QGenericArgument val9 = QGenericArgument()) const
0076 {
0077 return invoke(object, Qt::AutoConnection, returnValue,
0078 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
0079 }
0080 inline bool invoke(QObject *object,
0081 Qt::ConnectionType connectionType,
0082 QGenericArgument val0,
0083 QGenericArgument val1 = QGenericArgument(),
0084 QGenericArgument val2 = QGenericArgument(),
0085 QGenericArgument val3 = QGenericArgument(),
0086 QGenericArgument val4 = QGenericArgument(),
0087 QGenericArgument val5 = QGenericArgument(),
0088 QGenericArgument val6 = QGenericArgument(),
0089 QGenericArgument val7 = QGenericArgument(),
0090 QGenericArgument val8 = QGenericArgument(),
0091 QGenericArgument val9 = QGenericArgument()) const
0092 {
0093 return invoke(object, connectionType, QGenericReturnArgument(),
0094 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
0095 }
0096 inline bool invoke(QObject *object,
0097 QGenericArgument val0,
0098 QGenericArgument val1 = QGenericArgument(),
0099 QGenericArgument val2 = QGenericArgument(),
0100 QGenericArgument val3 = QGenericArgument(),
0101 QGenericArgument val4 = QGenericArgument(),
0102 QGenericArgument val5 = QGenericArgument(),
0103 QGenericArgument val6 = QGenericArgument(),
0104 QGenericArgument val7 = QGenericArgument(),
0105 QGenericArgument val8 = QGenericArgument(),
0106 QGenericArgument val9 = QGenericArgument()) const
0107 {
0108 return invoke(object, Qt::AutoConnection, QGenericReturnArgument(),
0109 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
0110 }
0111 bool invokeOnGadget(void *gadget,
0112 QGenericReturnArgument returnValue,
0113 QGenericArgument val0 = QGenericArgument(nullptr),
0114 QGenericArgument val1 = QGenericArgument(),
0115 QGenericArgument val2 = QGenericArgument(),
0116 QGenericArgument val3 = QGenericArgument(),
0117 QGenericArgument val4 = QGenericArgument(),
0118 QGenericArgument val5 = QGenericArgument(),
0119 QGenericArgument val6 = QGenericArgument(),
0120 QGenericArgument val7 = QGenericArgument(),
0121 QGenericArgument val8 = QGenericArgument(),
0122 QGenericArgument val9 = QGenericArgument()) const;
0123 inline bool invokeOnGadget(void *gadget,
0124 QGenericArgument val0,
0125 QGenericArgument val1 = QGenericArgument(),
0126 QGenericArgument val2 = QGenericArgument(),
0127 QGenericArgument val3 = QGenericArgument(),
0128 QGenericArgument val4 = QGenericArgument(),
0129 QGenericArgument val5 = QGenericArgument(),
0130 QGenericArgument val6 = QGenericArgument(),
0131 QGenericArgument val7 = QGenericArgument(),
0132 QGenericArgument val8 = QGenericArgument(),
0133 QGenericArgument val9 = QGenericArgument()) const
0134 {
0135 return invokeOnGadget(gadget, QGenericReturnArgument(),
0136 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9);
0137 }
0138 #endif
0139
0140 template <typename ReturnArg, typename... Args>
0141 #ifdef Q_QDOC
0142 bool
0143 #else
0144 QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
0145 #endif
0146 invoke(QObject *obj, Qt::ConnectionType c, QTemplatedMetaMethodReturnArgument<ReturnArg> r,
0147 Args &&... arguments) const
0148 {
0149 auto h = QtPrivate::invokeMethodHelper(r, std::forward<Args>(arguments)...);
0150 return invokeImpl(*this, obj, c, h.parameterCount(), h.parameters.data(),
0151 h.typeNames.data(), h.metaTypes.data());
0152 }
0153
0154 template <typename... Args>
0155 #ifdef Q_QDOC
0156 bool
0157 #else
0158 QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
0159 #endif
0160 invoke(QObject *obj, Qt::ConnectionType c, Args &&... arguments) const
0161 {
0162 return invoke(obj, c, QTemplatedMetaMethodReturnArgument<void>{}, std::forward<Args>(arguments)...);
0163 }
0164
0165 template <typename ReturnArg, typename... Args>
0166 #ifdef Q_QDOC
0167 bool
0168 #else
0169 QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
0170 #endif
0171 invoke(QObject *obj, QTemplatedMetaMethodReturnArgument<ReturnArg> r, Args &&... arguments) const
0172 {
0173 return invoke(obj, Qt::AutoConnection, r, std::forward<Args>(arguments)...);
0174 }
0175
0176 template <typename... Args>
0177 #ifdef Q_QDOC
0178 bool
0179 #else
0180 QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
0181 #endif
0182 invoke(QObject *obj, Args &&... arguments) const
0183 {
0184 return invoke(obj, Qt::AutoConnection, std::forward<Args>(arguments)...);
0185 }
0186
0187 template <typename ReturnArg, typename... Args>
0188 #ifdef Q_QDOC
0189 bool
0190 #else
0191 QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
0192 #endif
0193 invokeOnGadget(void *gadget, QTemplatedMetaMethodReturnArgument<ReturnArg> r, Args &&... arguments) const
0194 {
0195 auto h = QtPrivate::invokeMethodHelper(r, std::forward<Args>(arguments)...);
0196 return invokeImpl(*this, gadget, Qt::ConnectionType(-1), h.parameterCount(),
0197 h.parameters.data(), h.typeNames.data(), h.metaTypes.data());
0198 }
0199
0200 template <typename... Args>
0201 #ifdef Q_QDOC
0202 bool
0203 #else
0204 QtPrivate::Invoke::IfNotOldStyleArgs<bool, Args...>
0205 #endif
0206 invokeOnGadget(void *gadget, Args &&... arguments) const
0207 {
0208 return invokeOnGadget(gadget, QTemplatedMetaMethodReturnArgument<void>{}, std::forward<Args>(arguments)...);
0209 }
0210
0211 inline bool isValid() const { return mobj != nullptr; }
0212
0213 template <typename PointerToMemberFunction>
0214 static inline QMetaMethod fromSignal(PointerToMemberFunction signal)
0215 {
0216 typedef QtPrivate::FunctionPointer<PointerToMemberFunction> SignalType;
0217 static_assert(QtPrivate::HasQ_OBJECT_Macro<typename SignalType::Object>::Value,
0218 "No Q_OBJECT in the class with the signal");
0219 return fromSignalImpl(&SignalType::Object::staticMetaObject,
0220 reinterpret_cast<void **>(&signal));
0221 }
0222
0223 private:
0224 static bool invokeImpl(QMetaMethod self, void *target, Qt::ConnectionType, qsizetype paramCount,
0225 const void *const *parameters, const char *const *typeNames,
0226 const QtPrivate::QMetaTypeInterface *const *metaTypes);
0227 static QMetaMethod fromSignalImpl(const QMetaObject *, void **);
0228 static QMetaMethod fromRelativeMethodIndex(const QMetaObject *mobj, int index);
0229 static QMetaMethod fromRelativeConstructorIndex(const QMetaObject *mobj, int index);
0230
0231 protected:
0232 struct Data {
0233 enum { Size = 6 };
0234
0235 uint name() const { return d[0]; }
0236 uint argc() const { return d[1]; }
0237 uint parameters() const { return d[2]; }
0238 uint tag() const { return d[3]; }
0239 uint flags() const { return d[4]; }
0240 uint metaTypeOffset() const { return d[5]; }
0241 bool operator==(const Data &other) const { return d == other.d; }
0242
0243 const uint *d;
0244 };
0245 private:
0246 constexpr QMetaMethod(const QMetaObject *metaObject, const Data &data_)
0247 : mobj(metaObject), data(data_)
0248 {}
0249 protected:
0250
0251 const QMetaObject *mobj;
0252 Data data;
0253 friend struct QMetaObject;
0254 friend struct QMetaObjectPrivate;
0255 friend class QObject;
0256
0257 private:
0258 friend bool comparesEqual(const QMetaMethod &lhs, const QMetaMethod &rhs) noexcept
0259 { return lhs.data == rhs.data; }
0260 Q_DECLARE_EQUALITY_COMPARABLE(QMetaMethod)
0261 };
0262 Q_DECLARE_TYPEINFO(QMetaMethod, Q_RELOCATABLE_TYPE);
0263
0264 class Q_CORE_EXPORT QMetaEnum
0265 {
0266 public:
0267 constexpr inline QMetaEnum() : mobj(nullptr), data({ nullptr }) {}
0268
0269 const char *name() const;
0270 const char *enumName() const;
0271 QMetaType metaType() const;
0272
0273 bool isFlag() const;
0274 bool isScoped() const;
0275 bool is64Bit() const;
0276
0277 int keyCount() const;
0278 const char *key(int index) const;
0279 int value(int index) const;
0280 std::optional<quint64> value64(int index) const;
0281
0282 const char *scope() const;
0283
0284 int keyToValue(const char *key, bool *ok = nullptr) const;
0285 int keysToValue(const char *keys, bool *ok = nullptr) const;
0286 std::optional<quint64> keyToValue64(const char *key) const;
0287 std::optional<quint64> keysToValue64(const char *keys) const;
0288 #if QT_CORE_REMOVED_SINCE(6, 9)
0289 const char *valueToKey(int value) const;
0290 QByteArray valueToKeys(int value) const;
0291 #endif
0292 const char *valueToKey(quint64 value) const;
0293 QByteArray valueToKeys(quint64 value) const;
0294
0295 inline const QMetaObject *enclosingMetaObject() const { return mobj; }
0296
0297 inline bool isValid() const { return name() != nullptr; }
0298
0299 template<typename T>
0300 static QMetaEnum fromType()
0301 {
0302 static_assert(QtPrivate::IsQEnumHelper<T>::Value,
0303 "QMetaEnum::fromType only works with enums declared as "
0304 "Q_ENUM, Q_ENUM_NS, Q_FLAG or Q_FLAG_NS");
0305 const QMetaObject *metaObject = qt_getEnumMetaObject(T());
0306 const char *name = qt_getEnumName(T());
0307 return metaObject->enumerator(metaObject->indexOfEnumerator(name));
0308 }
0309
0310 private:
0311 struct Data {
0312 enum { Size = 5 };
0313 quint32 name() const { return d[0]; }
0314 quint32 alias() const { return d[1]; }
0315 quint32 flags() const { return d[2]; }
0316 qint32 keyCount() const { return static_cast<qint32>(d[3]); }
0317 quint32 data() const { return d[4]; }
0318 int index(const QMetaObject *mobj) const;
0319
0320 const uint *d;
0321 };
0322
0323 QMetaEnum(const QMetaObject *mobj, int index);
0324 template <typename... Args> quint64 value_helper(uint index, Args...) const noexcept;
0325
0326 const QMetaObject *mobj;
0327 Data data;
0328 friend struct QMetaObject;
0329 friend struct QMetaObjectPrivate;
0330 };
0331 Q_DECLARE_TYPEINFO(QMetaEnum, Q_RELOCATABLE_TYPE);
0332
0333 class Q_CORE_EXPORT QMetaProperty
0334 {
0335 public:
0336 constexpr QMetaProperty() : mobj(nullptr), data({ nullptr }) {}
0337
0338 const char *name() const;
0339 const char *typeName() const;
0340 #if QT_DEPRECATED_SINCE(6, 0)
0341 QT_WARNING_PUSH
0342 QT_WARNING_DISABLE_DEPRECATED
0343 QT_DEPRECATED_VERSION_6_0
0344 QVariant::Type type() const
0345 { int t = userType(); return t >= QMetaType::User ? QVariant::UserType : QVariant::Type(t); }
0346 QT_WARNING_POP
0347 #endif
0348 int userType() const { return typeId(); }
0349 int typeId() const { return metaType().id(); }
0350 QMetaType metaType() const;
0351 int propertyIndex() const;
0352 int relativePropertyIndex() const;
0353
0354 bool isReadable() const;
0355 bool isWritable() const;
0356 bool isResettable() const;
0357 bool isDesignable() const;
0358 bool isScriptable() const;
0359 bool isStored() const;
0360 bool isUser() const;
0361 bool isConstant() const;
0362 bool isFinal() const;
0363 bool isRequired() const;
0364 bool isBindable() const;
0365
0366 bool isFlagType() const;
0367 bool isEnumType() const;
0368 QMetaEnum enumerator() const;
0369
0370 bool hasNotifySignal() const;
0371 QMetaMethod notifySignal() const;
0372 int notifySignalIndex() const;
0373
0374 int revision() const;
0375
0376 QVariant read(const QObject *obj) const;
0377 bool write(QObject *obj, const QVariant &value) const;
0378 bool write(QObject *obj, QVariant &&value) const;
0379 bool reset(QObject *obj) const;
0380
0381 QUntypedBindable bindable(QObject *object) const;
0382
0383 QVariant readOnGadget(const void *gadget) const;
0384 bool writeOnGadget(void *gadget, const QVariant &value) const;
0385 bool writeOnGadget(void *gadget, QVariant &&value) const;
0386 bool resetOnGadget(void *gadget) const;
0387
0388 bool hasStdCppSet() const;
0389 bool isAlias() const;
0390 inline bool isValid() const { return isReadable(); }
0391 inline const QMetaObject *enclosingMetaObject() const { return mobj; }
0392
0393 private:
0394 #if QT_DEPRECATED_SINCE(6, 4)
0395 QT_DEPRECATED_VERSION_X_6_4("obsolete, simply returns typeId()")
0396 int registerPropertyType() const;
0397 #endif
0398
0399 struct Data {
0400 enum { Size = 5 };
0401
0402 uint name() const { return d[0]; }
0403 uint type() const { return d[1]; }
0404 uint flags() const { return d[2]; }
0405 uint notifyIndex() const { return d[3]; }
0406 uint revision() const { return d[4]; }
0407
0408 int index(const QMetaObject *mobj) const;
0409
0410 const uint *d;
0411 };
0412
0413 QMetaProperty(const QMetaObject *mobj, int index);
0414 static Data getMetaPropertyData(const QMetaObject *mobj, int index);
0415
0416 const QMetaObject *mobj;
0417 Data data;
0418 QMetaEnum menum;
0419 friend struct QMetaObject;
0420 friend struct QMetaObjectPrivate;
0421 };
0422
0423 class Q_CORE_EXPORT QMetaClassInfo
0424 {
0425 public:
0426 constexpr inline QMetaClassInfo() : mobj(nullptr), data({ nullptr }) {}
0427 const char *name() const;
0428 const char *value() const;
0429 inline const QMetaObject *enclosingMetaObject() const { return mobj; }
0430
0431 private:
0432 struct Data {
0433 enum { Size = 2 };
0434
0435 uint name() const { return d[0]; }
0436 uint value() const { return d[1]; }
0437
0438 const uint *d;
0439 };
0440
0441 const QMetaObject *mobj;
0442 Data data;
0443 friend struct QMetaObject;
0444 };
0445 Q_DECLARE_TYPEINFO(QMetaClassInfo, Q_RELOCATABLE_TYPE);
0446
0447 QT_END_NAMESPACE
0448
0449 #endif