aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlmetatype.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-11-02 12:15:40 +0100
committerUlf Hermann <ulf.hermann@qt.io>2020-11-02 14:00:29 +0100
commit50ba4ffdf48461d38f4dd2137a0fbbc916c9eb0a (patch)
tree6caac8e7a67d27f0a9025523ec6e6a418196740a /src/qml/qml/qqmlmetatype.cpp
parente826636a0bebd0d73e6c17038b24ee2a42d92ead (diff)
QML: Allow singleton types to be extended
It seems we never stated that singletons can not be extended in our documentation. Therefore this is technically a bug fix and doesn't need separate documentation. Change-Id: I7877289bd5a52ecf709f80ba1975137981ec65f0 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlmetatype.cpp')
-rw-r--r--src/qml/qml/qqmlmetatype.cpp39
1 files changed, 26 insertions, 13 deletions
diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp
index df5c4d89c5..e59ebc97eb 100644
--- a/src/qml/qml/qqmlmetatype.cpp
+++ b/src/qml/qml/qqmlmetatype.cpp
@@ -152,6 +152,8 @@ static QQmlTypePrivate *createQQmlType(QQmlMetaTypeData *data, const QString &el
d->extraData.sd->singletonInstanceInfo->typeName = QString::fromUtf8(type.typeName);
d->extraData.sd->singletonInstanceInfo->instanceMetaObject
= type.qObjectApi ? type.instanceMetaObject : nullptr;
+ d->extraData.sd->extFunc = type.extensionObjectCreate;
+ d->extraData.sd->extMetaObject = type.extensionMetaObject;
return d;
}
@@ -1606,23 +1608,34 @@ QList<QQmlProxyMetaObject::ProxyData> QQmlMetaType::proxyData(const QMetaObject
const QQmlMetaTypeDataPtr data;
+ auto createProxyMetaObject = [&](const QMetaObject *superdataBaseMetaObject,
+ const QMetaObject *extMetaObject,
+ QObject *(*extFunc)(QObject *)) {
+ if (!extMetaObject)
+ return;
+
+ QMetaObjectBuilder builder;
+ clone(builder, extMetaObject, superdataBaseMetaObject, baseMetaObject);
+ builder.setFlags(MetaObjectFlag::DynamicMetaObject);
+ QMetaObject *mmo = builder.toMetaObject();
+ mmo->d.superdata = baseMetaObject;
+ if (!metaObjects.isEmpty())
+ metaObjects.constLast().metaObject->d.superdata = mmo;
+ else if (lastMetaObject)
+ lastMetaObject->d.superdata = mmo;
+ QQmlProxyMetaObject::ProxyData data = { mmo, extFunc, 0, 0 };
+ metaObjects << data;
+ };
+
while (mo) {
QQmlTypePrivate *t = data->metaObjectToType.value(mo);
if (t) {
if (t->regType == QQmlType::CppType) {
- if (t->extraData.cd->extMetaObject) {
- QMetaObjectBuilder builder;
- clone(builder, t->extraData.cd->extMetaObject, t->baseMetaObject, baseMetaObject);
- builder.setFlags(MetaObjectFlag::DynamicMetaObject);
- QMetaObject *mmo = builder.toMetaObject();
- mmo->d.superdata = baseMetaObject;
- if (!metaObjects.isEmpty())
- metaObjects.constLast().metaObject->d.superdata = mmo;
- else if (lastMetaObject)
- lastMetaObject->d.superdata = mmo;
- QQmlProxyMetaObject::ProxyData data = { mmo, t->extraData.cd->extFunc, 0, 0 };
- metaObjects << data;
- }
+ createProxyMetaObject(t->baseMetaObject, t->extraData.cd->extMetaObject,
+ t->extraData.cd->extFunc);
+ } else if (t->regType == QQmlType::SingletonType) {
+ createProxyMetaObject(t->baseMetaObject, t->extraData.sd->extMetaObject,
+ t->extraData.sd->extFunc);
}
}
mo = mo->d.superdata;