aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/qml/qqml.h11
-rw-r--r--src/qml/qml/v8/qqmlbuiltinfunctions_p.h10
-rw-r--r--src/qmltyperegistrar/qmltyperegistrar.cpp18
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));