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/qqmlengine.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/qqmlengine.cpp')
-rw-r--r-- | src/qml/qml/qqmlengine.cpp | 106 |
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*>(); |