aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlengine.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-05-16 13:28:26 +0200
committerUlf Hermann <ulf.hermann@qt.io>2023-05-22 14:42:46 +0200
commitd5511fdea6caa4dee7ea97314e64163d309bd884 (patch)
tree168bf7c8ab57d5e42518511905e67420215677c5 /src/qml/qml/qqmlengine.cpp
parentf69bee0b7e7fea528cd60d8a6e23c75ccfb3aca6 (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/qqmlengine.cpp')
-rw-r--r--src/qml/qml/qqmlengine.cpp106
1 files changed, 99 insertions, 7 deletions
diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp
index d7542c09fc..64a0e48663 100644
--- a/src/qml/qml/qqmlengine.cpp
+++ b/src/qml/qml/qqmlengine.cpp
@@ -441,34 +441,126 @@ void QQmlData::flushPendingBinding(int coreIndex)
QQmlData::DeferredData::DeferredData() = default;
QQmlData::DeferredData::~DeferredData() = default;
+template<>
+int qmlRegisterType<void>(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
+{
+ QQmlPrivate::RegisterType type = {
+ QQmlPrivate::RegisterType::CurrentVersion,
+ QMetaType(),
+ QMetaType(),
+ 0, nullptr, nullptr,
+ QString(),
+ nullptr,
+ uri,
+ QTypeRevision::fromVersion(versionMajor, versionMinor),
+ qmlName,
+ nullptr,
+ nullptr,
+ nullptr,
+ -1,
+ -1,
+ -1,
+ nullptr,
+ nullptr,
+ nullptr,
+ QTypeRevision::zero(),
+ -1,
+ QQmlPrivate::ValueTypeCreationMethod::None,
+ };
+
+ return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type);
+}
+
bool QQmlEnginePrivate::baseModulesUninitialized = true;
void QQmlEnginePrivate::init()
{
Q_Q(QQmlEngine);
if (baseModulesUninitialized) {
+ // Named builtins
+ qmlRegisterType<void>("QML", 1, 0, "void");
+
+ const int varId = qmlRegisterType<QVariant>("QML", 1, 0, "var");
+ QQmlMetaType::registerTypeAlias(varId, QLatin1String("variant"));
+ qmlRegisterAnonymousSequentialContainer<QList<QVariant>>("QML", 1);
- // required for the Compiler.
qmlRegisterType<QObject>("QML", 1, 0, "QtObject");
qmlRegisterType<QQmlComponent>("QML", 1, 0, "Component");
- qmlRegisterAnonymousSequentialContainer<QList<QVariant>>("QML", 1);
- qmlRegisterAnonymousSequentialContainer<QList<bool>>("QML", 1);
+
+ qmlRegisterType<int>("QML", 1, 0, "int");
qmlRegisterAnonymousSequentialContainer<QList<int>>("QML", 1);
- qmlRegisterAnonymousSequentialContainer<QList<float>>("QML", 1);
+
+ const int realId = qmlRegisterType<double>("QML", 1, 0, "real");
+ QQmlMetaType::registerTypeAlias(realId, QLatin1String("double"));
qmlRegisterAnonymousSequentialContainer<QList<double>>("QML", 1);
+
+ qmlRegisterType<QString>("QML", 1, 0, "string");
qmlRegisterAnonymousSequentialContainer<QList<QString>>("QML", 1);
- qmlRegisterAnonymousSequentialContainer<QList<QUrl>>("QML", 1);
+
+ qmlRegisterType<bool>("QML", 1, 0, "bool");
+ qmlRegisterAnonymousSequentialContainer<QList<bool>>("QML", 1);
+
+ qmlRegisterType<QDateTime>("QML", 1, 0, "date");
qmlRegisterAnonymousSequentialContainer<QList<QDateTime>>("QML", 1);
+
+ qmlRegisterType<QUrl>("QML", 1, 0, "url");
+ qmlRegisterAnonymousSequentialContainer<QList<QUrl>>("QML", 1);
+
+#if QT_CONFIG(regularexpression)
+ qmlRegisterType<QRegularExpression>("QML", 1, 0, "regexp");
qmlRegisterAnonymousSequentialContainer<QList<QRegularExpression>>("QML", 1);
+#else
+ qmlRegisterType<void>("QML", 1, 0, "regexp");
+#endif
+
+ // Anonymous builtins
+ qmlRegisterAnonymousType<std::nullptr_t>("QML", 1);
+ qmlRegisterAnonymousType<QVariantMap>("QML", 1);
+
+ qmlRegisterAnonymousType<QJSValue>("QML", 1);
+ qmlRegisterAnonymousSequentialContainer<QList<QJSValue>>("QML", 1);
+
+ qmlRegisterAnonymousType<qint8>("QML", 1);
+ qmlRegisterAnonymousSequentialContainer<QList<qint8>>("QML", 1);
+
+ qmlRegisterAnonymousType<quint8>("QML", 1);
+ qmlRegisterAnonymousSequentialContainer<QList<quint8>>("QML", 1);
+
+ qmlRegisterAnonymousType<short>("QML", 1);
+ qmlRegisterAnonymousSequentialContainer<QList<short>>("QML", 1);
+
+ qmlRegisterAnonymousType<ushort>("QML", 1);
+ qmlRegisterAnonymousSequentialContainer<QList<ushort>>("QML", 1);
+
+ qmlRegisterAnonymousType<uint>("QML", 1);
+ qmlRegisterAnonymousSequentialContainer<QList<uint>>("QML", 1);
+
+ qmlRegisterAnonymousType<qlonglong>("QML", 1);
+ qmlRegisterAnonymousSequentialContainer<QList<qlonglong>>("QML", 1);
+
+ qmlRegisterAnonymousType<qulonglong>("QML", 1);
+ qmlRegisterAnonymousSequentialContainer<QList<qulonglong>>("QML", 1);
+
+ qmlRegisterAnonymousType<float>("QML", 1);
+ qmlRegisterAnonymousSequentialContainer<QList<float>>("QML", 1);
+
+ qmlRegisterAnonymousType<QChar>("QML", 1);
+ qmlRegisterAnonymousSequentialContainer<QList<QChar>>("QML", 1);
+
+ qmlRegisterAnonymousType<QDate>("QML", 1);
+ qmlRegisterAnonymousSequentialContainer<QList<QDate>>("QML", 1);
+
+ qmlRegisterAnonymousType<QTime>("QML", 1);
+ qmlRegisterAnonymousSequentialContainer<QList<QTime>>("QML", 1);
+
+ qmlRegisterAnonymousType<QByteArray>("QML", 1);
qmlRegisterAnonymousSequentialContainer<QList<QByteArray>>("QML", 1);
// No need to specifically register those.
static_assert(std::is_same_v<QStringList, QList<QString>>);
static_assert(std::is_same_v<QVariantList, QList<QVariant>>);
- qRegisterMetaType<QVariant>();
qRegisterMetaType<QQmlScriptString>();
- qRegisterMetaType<QJSValue>();
qRegisterMetaType<QQmlComponent::Status>();
qRegisterMetaType<QList<QObject*> >();
qRegisterMetaType<QQmlBinding*>();