diff options
-rw-r--r-- | src/qml/qml/qqml.h | 11 | ||||
-rw-r--r-- | src/qml/qml/v8/qqmlbuiltinfunctions_p.h | 10 | ||||
-rw-r--r-- | src/qmltyperegistrar/qmltyperegistrar.cpp | 18 |
3 files changed, 33 insertions, 6 deletions
diff --git a/src/qml/qml/qqml.h b/src/qml/qml/qqml.h index bd608c5c99..0d474d6c4e 100644 --- a/src/qml/qml/qqml.h +++ b/src/qml/qml/qqml.h @@ -125,6 +125,9 @@ template<typename T, typename... Args> \ friend void QML_REGISTER_TYPES_AND_REVISIONS(const char *uri, int versionMajor, QList<int> *); +#define QML_FOREIGN_NAMESPACE(FOREIGN_NAMESPACE) \ + Q_CLASSINFO("QML.Foreign", #FOREIGN_NAMESPACE) + #define QML_INTERFACE \ Q_CLASSINFO("QML.Element", "anonymous") \ enum class QmlIsInterface {yes = true}; \ @@ -850,8 +853,10 @@ inline void qmlRegisterTypesAndRevisions<>(const char *, int, QList<int> *) { } -inline void qmlRegisterNamespaceAndRevisions(const QMetaObject *metaObject, const char *uri, - int versionMajor, QList<int> *qmlTypeIds = nullptr) +inline void qmlRegisterNamespaceAndRevisions(const QMetaObject *metaObject, + const char *uri, int versionMajor, + QList<int> *qmlTypeIds = nullptr, + const QMetaObject *classInfoMetaObject = nullptr) { QQmlPrivate::RegisterTypeAndRevisions type = { 0, @@ -865,7 +870,7 @@ inline void qmlRegisterNamespaceAndRevisions(const QMetaObject *metaObject, cons QTypeRevision::fromMajorVersion(versionMajor), metaObject, - metaObject, + (classInfoMetaObject ? classInfoMetaObject : metaObject), nullptr, nullptr, diff --git a/src/qml/qml/v8/qqmlbuiltinfunctions_p.h b/src/qml/qml/v8/qqmlbuiltinfunctions_p.h index 8c64e5b1d8..65c68503e3 100644 --- a/src/qml/qml/v8/qqmlbuiltinfunctions_p.h +++ b/src/qml/qml/v8/qqmlbuiltinfunctions_p.h @@ -54,6 +54,7 @@ #include <private/qqmlglobal_p.h> #include <private/qv4functionobject_p.h> #include <private/qjsengine_p.h> +#include <QtCore/qnamespace.h> QT_BEGIN_NAMESPACE @@ -89,6 +90,15 @@ DECLARE_HEAP_OBJECT(QQmlBindingFunction, FunctionObject) { } +namespace QtInQml { +Q_NAMESPACE +QML_FOREIGN_NAMESPACE(Qt) +QML_NAMED_ELEMENT(Qt) +QML_ADDED_IN_VERSION(2, 0) +Q_CLASSINFO("QML.ManualRegistration", "true") +// should add the functions defined below... +} + struct QtObject : Object { V4_OBJECT2(QtObject, Object) diff --git a/src/qmltyperegistrar/qmltyperegistrar.cpp b/src/qmltyperegistrar/qmltyperegistrar.cpp index fafe594edb..c2918e515e 100644 --- a/src/qmltyperegistrar/qmltyperegistrar.cpp +++ b/src/qmltyperegistrar/qmltyperegistrar.cpp @@ -355,7 +355,14 @@ int main(int argc, char **argv) qPrintable(include)); } includes.append(include); - classDef.insert(QLatin1String("registerable"), true); + { + bool shouldRegister = true; + for (const QJsonValue &v : classDef.value(QLatin1String("classInfos")).toArray()) { + if (v[QLatin1String("name")].toString() == QLatin1String("QML.ManualRegistration")) + shouldRegister = QStringView(u"true").compare(v[QLatin1String("value")].toString(), Qt::CaseInsensitive) != 0; + } + classDef.insert(QLatin1String("registerable"), shouldRegister); + } types.append(classDef); break; @@ -427,8 +434,13 @@ int main(int argc, char **argv) const QString className = classDef[QLatin1String("qualifiedClassName")].toString(); if (classDef.value(QLatin1String("namespace")).toBool()) { - fprintf(output, "\n qmlRegisterNamespaceAndRevisions(&%s::staticMetaObject, \"%s\", %s);", - qPrintable(className), qPrintable(module), qPrintable(majorVersion)); + QString targetName = className; + for (const QJsonValue &v : classDef.value(QLatin1String("classInfos")).toArray()) { + if (v[QLatin1String("name")].toString() == QLatin1String("QML.Foreign")) + targetName = v[QLatin1String("value")].toString(); + } + fprintf(output, "\n qmlRegisterNamespaceAndRevisions(&%s::staticMetaObject, \"%s\", %s, nullptr, &%s::staticMetaObject);", + qPrintable(targetName), qPrintable(module), qPrintable(majorVersion), qPrintable(className)); } else { fprintf(output, "\n qmlRegisterTypesAndRevisions<%s>(\"%s\", %s);", qPrintable(className), qPrintable(module), qPrintable(majorVersion)); |