diff options
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r-- | src/corelib/kernel/qmetaobject.cpp | 27 | ||||
-rw-r--r-- | src/corelib/kernel/qmetaobject_p.h | 2 | ||||
-rw-r--r-- | src/corelib/kernel/qmetaobjectbuilder.cpp | 9 | ||||
-rw-r--r-- | src/corelib/kernel/qobjectdefs.h | 2 |
4 files changed, 37 insertions, 3 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index 650ea60617..a574bec179 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -384,6 +384,33 @@ QString QMetaObject::tr(const char *s, const char *c, int n) const { return QCoreApplication::translate(objectClassName(this), s, c, n); } + +/*! + \since 6.2 + Returns the metatype corresponding to this metaobject. + If the metaobject originates from a namespace, an invalid metatype is returned. + */ +QMetaType QMetaObject::metaType() const +{ + + const QMetaObjectPrivate *d = priv(this->d.data); + if (d->revision < 10) { + // before revision 10, we did not store the metatype in the metatype array + return QMetaType::fromName(className()); + } else { + /* in the metatype array, we store + idx: 0 propertyCount - 1 propertyCount + data:QMetaType(prop0), ..., QMetaType(propPropCount-1), QMetaType(class),... + */ + auto iface = this->d.metaTypes[d->propertyCount]; + if (iface == QtPrivate::qMetaTypeInterfaceForType<void>()) + return QMetaType(); // return invalid meta-type for namespaces + if (iface) + return QMetaType(iface); + else // in case of a dynamic metaobject, we might have no metatype stored + return QMetaType::fromName(className()); // try lookup by name in that case + } +} #endif // QT_NO_TRANSLATION /*! diff --git a/src/corelib/kernel/qmetaobject_p.h b/src/corelib/kernel/qmetaobject_p.h index dbd82ba27b..c25735cb86 100644 --- a/src/corelib/kernel/qmetaobject_p.h +++ b/src/corelib/kernel/qmetaobject_p.h @@ -172,7 +172,7 @@ struct QMetaObjectPrivate // revision 7 is Qt 5.0 everything lower is not supported // revision 8 is Qt 5.12: It adds the enum name to QMetaEnum // revision 9 is Qt 6.0: It adds the metatype of properties and methods - enum { OutputRevision = 9 }; // Used by moc, qmetaobjectbuilder and qdbus + enum { OutputRevision = 10 }; // Used by moc, qmetaobjectbuilder and qdbus enum { IntsPerMethod = QMetaMethod::Data::Size }; enum { IntsPerEnum = QMetaEnum::Data::Size }; enum { IntsPerProperty = QMetaProperty::Data::Size }; diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp index 3ee7d17545..8c55bdb3ae 100644 --- a/src/corelib/kernel/qmetaobjectbuilder.cpp +++ b/src/corelib/kernel/qmetaobjectbuilder.cpp @@ -1203,7 +1203,7 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf, - int(d->methods.size()) // return "parameters" don't have names - int(d->constructors.size()); // "this" parameters don't have names if constexpr (mode == Construct) { - static_assert(QMetaObjectPrivate::OutputRevision == 9, "QMetaObjectBuilder should generate the same version as moc"); + static_assert(QMetaObjectPrivate::OutputRevision == 10, "QMetaObjectBuilder should generate the same version as moc"); pmeta->revision = QMetaObjectPrivate::OutputRevision; pmeta->flags = d->flags; pmeta->className = 0; // Class name is always the first string. @@ -1281,7 +1281,8 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf, // Output the methods in the class. Q_ASSERT(!buf || dataIndex == pmeta->methodData); - int parameterMetaTypesIndex = int(d->properties.size()); + // + 1 for metatype of this metaobject + int parameterMetaTypesIndex = int(d->properties.size()) + 1; for (const auto &method : d->methods) { [[maybe_unused]] int name = strings.enter(method.name()); int argc = method.parameterCount(); @@ -1448,6 +1449,10 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf, *types = reinterpret_cast<QtPrivate::QMetaTypeInterface *&>(mt); types++; } + // add metatype interface for this metaobject - must be null + // as we can't know our metatype + *types = nullptr; + types++; for (const auto &method: d->methods) { QMetaType mt(QMetaType::fromName(method.returnType).id()); *types = reinterpret_cast<QtPrivate::QMetaTypeInterface *&>(mt); diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h index 5ade222ac5..00a6b62eab 100644 --- a/src/corelib/kernel/qobjectdefs.h +++ b/src/corelib/kernel/qobjectdefs.h @@ -173,6 +173,8 @@ struct Q_CORE_EXPORT QMetaObject QString tr(const char *s, const char *c, int n = -1) const; #endif // QT_NO_TRANSLATION + QMetaType metaType() const; + int methodOffset() const; int enumeratorOffset() const; int propertyOffset() const; |