diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-05-16 13:28:26 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-05-22 14:42:46 +0200 |
commit | d5511fdea6caa4dee7ea97314e64163d309bd884 (patch) | |
tree | 168bf7c8ab57d5e42518511905e67420215677c5 /src/qml/qml/qqmlmetatype.cpp | |
parent | f69bee0b7e7fea528cd60d8a6e23c75ccfb3aca6 (diff) |
QML: Register all builtins
We need run time access to the QQmlType instances of all the builtins in
order to properly coerce types without special casing everything all the
time.
Since we can now have QML types without metaobjects, we need to check
for the metaobject in a few places where we didn't need to check before.
Change-Id: Ib22cbb12c60ebdce4897c3f3338851e8b925926f
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlmetatype.cpp')
-rw-r--r-- | src/qml/qml/qqmlmetatype.cpp | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index dbc31a1cd1..26ab192c31 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -320,6 +320,14 @@ void QQmlMetaType::clearTypeRegistrations() data->propertyCaches.clear(); } +void QQmlMetaType::registerTypeAlias(int typeIndex, const QString &name) +{ + QQmlMetaTypeDataPtr data; + const QQmlType type = data->types.value(typeIndex); + const QQmlTypePrivate *priv = type.priv(); + data->nameToType.insert(name, priv); +} + int QQmlMetaType::registerAutoParentFunction(const QQmlPrivate::RegisterAutoParent &function) { if (function.structVersion > 1) @@ -1347,9 +1355,12 @@ QQmlPropertyCache::ConstPtr QQmlMetaType::propertyCacheForType(QMetaType metaTyp return composite; const QQmlTypePrivate *type = data->idToType.value(metaType.id()); - return (type && type->typeId == metaType) - ? data->propertyCache(QQmlType(type).metaObject(), type->version) - : QQmlPropertyCache::ConstPtr(); + if (type && type->typeId == metaType) { + if (const QMetaObject *mo = QQmlType(type).metaObject()) + return data->propertyCache(mo, type->version); + } + + return QQmlPropertyCache::ConstPtr(); } /*! @@ -1389,8 +1400,11 @@ QQmlPropertyCache::ConstPtr QQmlMetaType::rawPropertyCacheForType( return QQmlPropertyCache::ConstPtr(); const QQmlType type(typePriv); - if (type.containsRevisionedAttributes()) + if (type.containsRevisionedAttributes()) { + // It can only have (revisioned) properties or methods if it has a metaobject + Q_ASSERT(type.metaObject()); return data->propertyCache(type, version); + } if (const QMetaObject *metaObject = type.metaObject()) return data->propertyCache(metaObject, version); @@ -1510,7 +1524,7 @@ QList<QQmlType> QQmlMetaType::qmlTypes() const QQmlMetaTypeDataPtr data; QList<QQmlType> types; - for (QQmlTypePrivate *t : data->nameToType) + for (const QQmlTypePrivate *t : data->nameToType) types.append(QQmlType(t)); return types; |