// Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QQML_H #define QQML_H #include #include #include #include #include #include #include #define QML_VERSION 0x020000 #define QML_VERSION_STR "2.0" #define QML_DECLARE_TYPE(TYPE) \ Q_DECLARE_METATYPE(TYPE*) \ Q_DECLARE_METATYPE(QQmlListProperty) #define QML_DECLARE_TYPE_HASMETATYPE(TYPE) \ Q_DECLARE_METATYPE(QQmlListProperty) #define QML_DECLARE_INTERFACE(INTERFACE) \ QML_DECLARE_TYPE(INTERFACE) #define QML_DECLARE_INTERFACE_HASMETATYPE(INTERFACE) \ QML_DECLARE_TYPE_HASMETATYPE(INTERFACE) enum { /* TYPEINFO flags */ QML_HAS_ATTACHED_PROPERTIES = 0x01 }; #define QML_DECLARE_TYPEINFO(TYPE, FLAGS) \ QT_BEGIN_NAMESPACE \ template <> \ class QQmlTypeInfo \ { \ public: \ enum { \ hasAttachedProperties = (((FLAGS) & QML_HAS_ATTACHED_PROPERTIES) == QML_HAS_ATTACHED_PROPERTIES) \ }; \ }; \ QT_END_NAMESPACE QT_BEGIN_NAMESPACE void Q_QML_EXPORT qmlClearTypeRegistrations(); template QQmlCustomParser *qmlCreateCustomParser(); template int qmlRegisterAnonymousType(const char *uri, int versionMajor) { QQmlPrivate::RegisterType type = { QQmlPrivate::RegisterType::CurrentVersion, QQmlPrivate::QmlMetaType::self(), QQmlPrivate::QmlMetaType::list(), 0, nullptr, nullptr, QString(), QQmlPrivate::ValueType::create, uri, QTypeRevision::fromVersion(versionMajor, 0), nullptr, QQmlPrivate::StaticMetaObject::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc(), QQmlPrivate::attachedPropertiesMetaObject(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), nullptr, nullptr, nullptr, QTypeRevision::zero(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ValueTypeCreationMethod::None, }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } //! \internal template int qmlRegisterAnonymousType(const char *uri, int versionMajor) { QQmlPrivate::RegisterType type = { QQmlPrivate::RegisterType::CurrentVersion, QQmlPrivate::QmlMetaType::self(), QQmlPrivate::QmlMetaType::list(), 0, nullptr, nullptr, QString(), QQmlPrivate::ValueType::create, uri, QTypeRevision::fromVersion(versionMajor, 0), nullptr, QQmlPrivate::StaticMetaObject::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc(), QQmlPrivate::attachedPropertiesMetaObject(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), nullptr, nullptr, nullptr, QTypeRevision::fromMinorVersion(metaObjectRevisionMinor), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ValueTypeCreationMethod::None, }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } //! \internal template void qmlRegisterAnonymousTypesAndRevisions(const char *uri, int versionMajor) { // Anonymous types are not creatable, no need to warn about missing acceptable constructors. QQmlPrivate::qmlRegisterTypeAndRevisions( uri, versionMajor, QQmlPrivate::StaticMetaObject::staticMetaObject(), nullptr, nullptr, true); } class QQmlTypeNotAvailable : public QObject { Q_OBJECT QML_NAMED_ELEMENT(TypeNotAvailable) QML_ADDED_IN_VERSION(2, 15) QML_UNCREATABLE("Type not available.") }; int Q_QML_EXPORT qmlRegisterTypeNotAvailable(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &message); template int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason) { QQmlPrivate::RegisterType type = { QQmlPrivate::RegisterType::CurrentVersion, QQmlPrivate::QmlMetaType::self(), QQmlPrivate::QmlMetaType::list(), 0, nullptr, nullptr, reason, QQmlPrivate::ValueType::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc(), QQmlPrivate::attachedPropertiesMetaObject(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), nullptr, nullptr, nullptr, QTypeRevision::zero(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ValueTypeCreationMethod::None, }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } template int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason) { QQmlPrivate::RegisterType type = { QQmlPrivate::RegisterType::CurrentVersion, QQmlPrivate::QmlMetaType::self(), QQmlPrivate::QmlMetaType::list(), 0, nullptr, nullptr, reason, QQmlPrivate::ValueType::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc(), QQmlPrivate::attachedPropertiesMetaObject(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), nullptr, nullptr, nullptr, QTypeRevision::fromMinorVersion(metaObjectRevision), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ValueTypeCreationMethod::None, }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } template int qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason) { QQmlAttachedPropertiesFunc attached = QQmlPrivate::attachedPropertiesFunc(); const QMetaObject * attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject(); if (!attached) { attached = QQmlPrivate::attachedPropertiesFunc(); attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject(); } QQmlPrivate::RegisterType type = { QQmlPrivate::RegisterType::CurrentVersion, QQmlPrivate::QmlMetaType::self(), QQmlPrivate::QmlMetaType::list(), 0, nullptr, nullptr, reason, QQmlPrivate::ValueType::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject::staticMetaObject(), attached, attachedMetaObject, QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ExtendedType::createParent, QQmlPrivate::ExtendedType::staticMetaObject(), nullptr, QTypeRevision::zero(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ValueTypeCreationMethod::None, }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } template int qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason) { QQmlAttachedPropertiesFunc attached = QQmlPrivate::attachedPropertiesFunc(); const QMetaObject * attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject(); if (!attached) { attached = QQmlPrivate::attachedPropertiesFunc(); attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject(); } QQmlPrivate::RegisterType type = { QQmlPrivate::RegisterType::CurrentVersion, QQmlPrivate::QmlMetaType::self(), QQmlPrivate::QmlMetaType::list(), 0, nullptr, nullptr, reason, QQmlPrivate::ValueType::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject::staticMetaObject(), attached, attachedMetaObject, QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ExtendedType::createParent, QQmlPrivate::ExtendedType::staticMetaObject(), nullptr, QTypeRevision::fromMinorVersion(metaObjectRevision), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ValueTypeCreationMethod::None, }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } Q_QML_EXPORT int qmlRegisterUncreatableMetaObject(const QMetaObject &staticMetaObject, const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason); template int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName) { static_assert(!std::is_abstract_v, "It is not possible to register an abstract type with qmlRegisterType. " "Maybe you wanted qmlRegisterUncreatableType or qmlRegisterInterface?"); QQmlPrivate::RegisterType type = { QQmlPrivate::RegisterType::CurrentVersion, QQmlPrivate::QmlMetaType::self(), QQmlPrivate::QmlMetaType::list(), sizeof(T), QQmlPrivate::Constructors::createInto, nullptr, QString(), QQmlPrivate::ValueType::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc(), QQmlPrivate::attachedPropertiesMetaObject(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), nullptr, nullptr, nullptr, QTypeRevision::zero(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ValueTypeCreationMethod::None, }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } template int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName) { static_assert(!std::is_abstract_v, "It is not possible to register an abstract type with qmlRegisterType. " "Maybe you wanted qmlRegisterUncreatableType or qmlRegisterInterface?"); QQmlPrivate::RegisterType type = { QQmlPrivate::RegisterType::CurrentVersion, QQmlPrivate::QmlMetaType::self(), QQmlPrivate::QmlMetaType::list(), sizeof(T), QQmlPrivate::Constructors::createInto, nullptr, QString(), QQmlPrivate::ValueType::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc(), QQmlPrivate::attachedPropertiesMetaObject(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), nullptr, nullptr, nullptr, QTypeRevision::fromMinorVersion(metaObjectRevision), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ValueTypeCreationMethod::None, }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } template int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor) { QQmlPrivate::RegisterType type = { QQmlPrivate::RegisterType::CurrentVersion, QQmlPrivate::QmlMetaType::self(), QQmlPrivate::QmlMetaType::list(), sizeof(T), QQmlPrivate::Constructors::createInto, nullptr, QString(), QQmlPrivate::ValueType::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), nullptr, QQmlPrivate::StaticMetaObject::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc(), QQmlPrivate::attachedPropertiesMetaObject(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), nullptr, nullptr, nullptr, QTypeRevision::fromMinorVersion(metaObjectRevision), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ValueTypeCreationMethod::None, }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } template int qmlRegisterExtendedType(const char *uri, int versionMajor) { static_assert(!std::is_abstract_v, "It is not possible to register an extension to an abstract type with qmlRegisterExtendedType."); static_assert(!std::is_abstract_v, "It is not possible to register an abstract type with qmlRegisterExtendedType. " "Maybe you wanted qmlRegisterExtendedUncreatableType?"); QQmlPrivate::RegisterType type = { QQmlPrivate::RegisterType::CurrentVersion, QQmlPrivate::QmlMetaType::self(), QQmlPrivate::QmlMetaType::list(), 0, nullptr, nullptr, QString(), QQmlPrivate::ValueType::create, uri, QTypeRevision::fromVersion(versionMajor, 0), nullptr, QQmlPrivate::StaticMetaObject::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc(), QQmlPrivate::attachedPropertiesMetaObject(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ExtendedType::createParent, QQmlPrivate::ExtendedType::staticMetaObject(), nullptr, QTypeRevision::zero(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ValueTypeCreationMethod::None, }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } template int qmlRegisterExtendedType(const char *uri, int versionMajor, int versionMinor, const char *qmlName) { static_assert(!std::is_abstract_v, "It is not possible to register an extension to an abstract type with qmlRegisterExtendedType."); static_assert(!std::is_abstract_v, "It is not possible to register an abstract type with qmlRegisterExtendedType. " "Maybe you wanted qmlRegisterExtendedUncreatableType?"); QQmlAttachedPropertiesFunc attached = QQmlPrivate::attachedPropertiesFunc(); const QMetaObject * attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject(); if (!attached) { attached = QQmlPrivate::attachedPropertiesFunc(); attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject(); } QQmlPrivate::RegisterType type = { QQmlPrivate::RegisterType::CurrentVersion, QQmlPrivate::QmlMetaType::self(), QQmlPrivate::QmlMetaType::list(), sizeof(T), QQmlPrivate::Constructors::createInto, nullptr, QString(), QQmlPrivate::ValueType::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject::staticMetaObject(), attached, attachedMetaObject, QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ExtendedType::createParent, QQmlPrivate::ExtendedType::staticMetaObject(), nullptr, QTypeRevision::zero(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ValueTypeCreationMethod::None, }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } template int qmlRegisterInterface(const char *uri, int versionMajor) { QQmlPrivate::RegisterInterface qmlInterface = { 0, // An interface is not a QObject itself but is typically casted to one. // Therefore, we still want the pointer. QMetaType::fromType(), QMetaType::fromType >(), qobject_interface_iid(), uri, QTypeRevision::fromVersion(versionMajor, 0) }; return QQmlPrivate::qmlregister(QQmlPrivate::InterfaceRegistration, &qmlInterface); } template int qmlRegisterCustomType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, QQmlCustomParser *parser) { static_assert(!std::is_abstract_v, "It is not possible to register an abstract type with qmlRegisterCustomType. " "Maybe you wanted qmlRegisterUncreatableType or qmlRegisterInterface?"); QQmlPrivate::RegisterType type = { QQmlPrivate::RegisterType::CurrentVersion, QQmlPrivate::QmlMetaType::self(), QQmlPrivate::QmlMetaType::list(), sizeof(T), QQmlPrivate::Constructors::createInto, nullptr, QString(), QQmlPrivate::ValueType::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc(), QQmlPrivate::attachedPropertiesMetaObject(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), nullptr, nullptr, parser, QTypeRevision::zero(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ValueTypeCreationMethod::None, }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } template int qmlRegisterCustomType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, QQmlCustomParser *parser) { static_assert(!std::is_abstract_v, "It is not possible to register an abstract type with qmlRegisterCustomType. " "Maybe you wanted qmlRegisterUncreatableType or qmlRegisterInterface?"); QQmlPrivate::RegisterType type = { QQmlPrivate::RegisterType::CurrentVersion, QQmlPrivate::QmlMetaType::self(), QQmlPrivate::QmlMetaType::list(), sizeof(T), QQmlPrivate::Constructors::createInto, nullptr, QString(), QQmlPrivate::ValueType::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject::staticMetaObject(), QQmlPrivate::attachedPropertiesFunc(), QQmlPrivate::attachedPropertiesMetaObject(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), nullptr, nullptr, parser, QTypeRevision::fromMinorVersion(metaObjectRevision), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ValueTypeCreationMethod::None, }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } template int qmlRegisterCustomExtendedType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, QQmlCustomParser *parser) { static_assert(!std::is_abstract_v, "It is not possible to register an extension to an abstract type with qmlRegisterCustomExtendedType."); static_assert(!std::is_abstract_v, "It is not possible to register an abstract type with qmlRegisterCustomExtendedType."); QQmlAttachedPropertiesFunc attached = QQmlPrivate::attachedPropertiesFunc(); const QMetaObject * attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject(); if (!attached) { attached = QQmlPrivate::attachedPropertiesFunc(); attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject(); } QQmlPrivate::RegisterType type = { QQmlPrivate::RegisterType::CurrentVersion, QQmlPrivate::QmlMetaType::self(), QQmlPrivate::QmlMetaType::list(), sizeof(T), QQmlPrivate::Constructors::createInto, nullptr, QString(), QQmlPrivate::ValueType::create, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName, QQmlPrivate::StaticMetaObject::staticMetaObject(), attached, attachedMetaObject, QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ExtendedType::createParent, QQmlPrivate::ExtendedType::staticMetaObject(), parser, QTypeRevision::zero(), QQmlPrivate::StaticCastSelector::cast(), QQmlPrivate::ValueTypeCreationMethod::None, }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } class QQmlContext; class QQmlEngine; class QJSValue; class QJSEngine; Q_QML_EXPORT void qmlExecuteDeferred(QObject *); Q_QML_EXPORT QQmlContext *qmlContext(const QObject *); Q_QML_EXPORT QQmlEngine *qmlEngine(const QObject *); Q_QML_EXPORT QQmlAttachedPropertiesFunc qmlAttachedPropertiesFunction(QObject *, const QMetaObject *); Q_QML_EXPORT QObject *qmlAttachedPropertiesObject(QObject *, QQmlAttachedPropertiesFunc func, bool create = true); Q_QML_EXPORT QObject *qmlExtendedObject(QObject *); //The C++ version of protected namespaces in qmldir Q_QML_EXPORT bool qmlProtectModule(const char* uri, int majVersion); Q_QML_EXPORT void qmlRegisterModule(const char *uri, int versionMajor, int versionMinor); enum QQmlModuleImportSpecialVersions: int { QQmlModuleImportModuleAny = -1, QQmlModuleImportLatest = -1, QQmlModuleImportAuto = -2 }; Q_QML_EXPORT void qmlRegisterModuleImport(const char *uri, int moduleMajor, const char *import, int importMajor = QQmlModuleImportLatest, int importMinor = QQmlModuleImportLatest); Q_QML_EXPORT void qmlUnregisterModuleImport(const char *uri, int moduleMajor, const char *import, int importMajor = QQmlModuleImportLatest, int importMinor = QQmlModuleImportLatest); template QObject *qmlAttachedPropertiesObject(const QObject *obj, bool create = true) { // We don't need a concrete object to resolve the function. As T is a C++ type, it and all its // super types should be registered as CppType (or not at all). We only need the object and its // QML engine to resolve composite types. Therefore, the function is actually a static property // of the C++ type system and we can cache it here for improved performance on further lookups. static const auto func = qmlAttachedPropertiesFunction(nullptr, &T::staticMetaObject); return qmlAttachedPropertiesObject(const_cast(obj), func, create); } #ifdef Q_QDOC int qmlRegisterSingletonType( const char *uri, int versionMajor, int versionMinor, const char *typeName, std::function callback) #else template>::value, void>::type* = nullptr> int qmlRegisterSingletonType( const char *uri, int versionMajor, int versionMinor, const char *typeName, F &&callback) #endif { QQmlPrivate::RegisterSingletonType api = { 0, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), typeName, std::forward(callback), nullptr, nullptr, QMetaType(), nullptr, nullptr, QTypeRevision::zero() }; return QQmlPrivate::qmlregister(QQmlPrivate::SingletonRegistration, &api); } #ifdef Q_QDOC template int qmlRegisterSingletonType( const char *uri, int versionMajor, int versionMinor, const char *typeName, std::function callback) #else template>::value, void>::type* = nullptr> int qmlRegisterSingletonType( const char *uri, int versionMajor, int versionMinor, const char *typeName, F &&callback) #endif { QQmlPrivate::RegisterSingletonType api = { 0, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), typeName, nullptr, std::forward(callback), QQmlPrivate::StaticMetaObject::staticMetaObject(), QQmlPrivate::QmlMetaType::self(), nullptr, nullptr, QTypeRevision::zero() }; return QQmlPrivate::qmlregister(QQmlPrivate::SingletonRegistration, &api); } #ifdef Q_QDOC int qmlRegisterSingletonInstance(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *cppObject) #else template inline auto qmlRegisterSingletonInstance(const char *uri, int versionMajor, int versionMinor, const char *typeName, T *cppObject) -> typename std::enable_if::value, int>::type #endif { QQmlPrivate::SingletonInstanceFunctor registrationFunctor; registrationFunctor.m_object = cppObject; return qmlRegisterSingletonType(uri, versionMajor, versionMinor, typeName, registrationFunctor); } inline int qmlRegisterSingletonType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName) { if (url.isRelative()) { // User input check must go here, because QQmlPrivate::qmlregister is also used internally for composite types qWarning("qmlRegisterSingletonType requires absolute URLs."); return 0; } QQmlPrivate::RegisterCompositeSingletonType type = { 0, url, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName }; return QQmlPrivate::qmlregister(QQmlPrivate::CompositeSingletonRegistration, &type); } inline int qmlRegisterType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName) { if (url.isRelative()) { // User input check must go here, because QQmlPrivate::qmlregister is also used internally for composite types qWarning("qmlRegisterType requires absolute URLs."); return 0; } QQmlPrivate::RegisterCompositeType type = { 0, url, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), qmlName }; return QQmlPrivate::qmlregister(QQmlPrivate::CompositeRegistration, &type); } template inline int qmlRegisterAnonymousSequentialContainer(const char *uri, int versionMajor) { static_assert(!std::is_abstract_v, "It is not possible to register an abstract container with qmlRegisterAnonymousSequentialContainer."); QQmlPrivate::RegisterSequentialContainer type = { 0, uri, QTypeRevision::fromMajorVersion(versionMajor), nullptr, QMetaType::fromType(), QMetaSequence::fromContainer(), QTypeRevision::zero() }; return QQmlPrivate::qmlregister(QQmlPrivate::SequentialContainerRegistration, &type); } template struct QmlTypeAndRevisionsRegistration; template struct QmlTypeAndRevisionsRegistration { static void registerTypeAndRevisions(const char *uri, int versionMajor, QList *qmlTypeIds, const QMetaObject *extension) { #if QT_DEPRECATED_SINCE(6, 4) // ### Qt7: Remove the warnings, and leave only the static asserts below. if constexpr (!QQmlPrivate::QmlMetaType::hasAcceptableCtors()) { QQmlPrivate::qmlRegistrationWarning(QQmlPrivate::UnconstructibleType, QMetaType::fromType()); } if constexpr (!std::is_base_of_v && QQmlTypeInfo::hasAttachedProperties) { QQmlPrivate::qmlRegistrationWarning(QQmlPrivate::NonQObjectWithAtached, QMetaType::fromType()); } #else static_assert(QQmlPrivate::QmlMetaType::hasAcceptableCtors(), "This type is neither a default constructible QObject, nor a default- " "and copy-constructible Q_GADGET, nor marked as uncreatable.\n" "You should not use it as a QML type."); static_assert(std::is_base_of_v || !QQmlTypeInfo::hasAttachedProperties); #endif QQmlPrivate::qmlRegisterTypeAndRevisions( uri, versionMajor, QQmlPrivate::StaticMetaObject::staticMetaObject(), qmlTypeIds, extension); } }; template struct QmlTypeAndRevisionsRegistration { static void registerTypeAndRevisions(const char *uri, int versionMajor, QList *qmlTypeIds, const QMetaObject *extension) { #if QT_DEPRECATED_SINCE(6, 4) // ### Qt7: Remove the warning, and leave only the static assert below. if constexpr (!std::is_base_of_v && QQmlTypeInfo::hasAttachedProperties) { QQmlPrivate::qmlRegistrationWarning(QQmlPrivate::NonQObjectWithAtached, QMetaType::fromType()); } #else static_assert(std::is_base_of_v || !QQmlTypeInfo::hasAttachedProperties); #endif QQmlPrivate::qmlRegisterTypeAndRevisions( uri, versionMajor, QQmlPrivate::StaticMetaObject::staticMetaObject(), qmlTypeIds, extension); } }; template struct QmlTypeAndRevisionsRegistration { static void registerTypeAndRevisions(const char *uri, int versionMajor, QList *qmlTypeIds, const QMetaObject *) { // Sequences have to be anonymous for now, which implies uncreatable. QQmlPrivate::qmlRegisterSequenceAndRevisions( uri, versionMajor, QQmlPrivate::StaticMetaObject::staticMetaObject(), qmlTypeIds); } }; template struct QmlTypeAndRevisionsRegistration { static void registerTypeAndRevisions(const char *uri, int versionMajor, QList *qmlTypeIds, const QMetaObject *extension) { #if QT_DEPRECATED_SINCE(6, 4) // ### Qt7: Remove the warning, and leave only the static assert below. if constexpr (QQmlPrivate::singletonConstructionMode() == QQmlPrivate::SingletonConstructionMode::None) { QQmlPrivate::qmlRegistrationWarning(QQmlPrivate::UnconstructibleSingleton, QMetaType::fromType()); } #else static_assert(QQmlPrivate::singletonConstructionMode() != QQmlPrivate::SingletonConstructionMode::None, "A singleton needs either a default constructor or, when adding a default " "constructor is infeasible, a public static " "create(QQmlEngine *, QJSEngine *) method"); #endif QQmlPrivate::qmlRegisterSingletonAndRevisions( uri, versionMajor, QQmlPrivate::StaticMetaObject::staticMetaObject(), qmlTypeIds, extension); } }; template struct QmlTypeAndRevisionsRegistration { static void registerTypeAndRevisions(const char *uri, int versionMajor, QList *qmlTypeIds, const QMetaObject *extension) { // An uncreatable singleton makes little sense? OK, you can still use the enums. QQmlPrivate::qmlRegisterSingletonAndRevisions( uri, versionMajor, QQmlPrivate::StaticMetaObject::staticMetaObject(), qmlTypeIds, extension); } }; template struct QmlTypeAndRevisionsRegistration { static void registerTypeAndRevisions(const char *uri, int versionMajor, QList *qmlTypeIds, const QMetaObject *) { const int id = qmlRegisterInterface(uri, versionMajor); if (qmlTypeIds) qmlTypeIds->append(id); } }; template void qmlRegisterTypesAndRevisions(const char *uri, int versionMajor, QList *qmlTypeIds) { (QmlTypeAndRevisionsRegistration< T, typename QQmlPrivate::QmlResolved::Type, typename QQmlPrivate::QmlExtended::Type, QQmlPrivate::QmlSingleton::Value, QQmlPrivate::QmlInterface::Value, QQmlPrivate::QmlSequence::Value, QQmlPrivate::QmlUncreatable::Value || QQmlPrivate::QmlAnonymous::Value> ::registerTypeAndRevisions(uri, versionMajor, qmlTypeIds, QQmlPrivate::QmlExtendedNamespace::metaObject()), ...); } inline void qmlRegisterNamespaceAndRevisions(const QMetaObject *metaObject, const char *uri, int versionMajor, QList *qmlTypeIds, const QMetaObject *classInfoMetaObject, const QMetaObject *extensionMetaObject) { QQmlPrivate::RegisterTypeAndRevisions type = { 3, QMetaType(), QMetaType(), 0, nullptr, nullptr, nullptr, uri, QTypeRevision::fromMajorVersion(versionMajor), metaObject, (classInfoMetaObject ? classInfoMetaObject : metaObject), nullptr, nullptr, -1, -1, -1, nullptr, extensionMetaObject, &qmlCreateCustomParser, qmlTypeIds, -1, false, QMetaSequence() }; qmlregister(QQmlPrivate::TypeAndRevisionsRegistration, &type); } inline void qmlRegisterNamespaceAndRevisions(const QMetaObject *metaObject, const char *uri, int versionMajor, QList *qmlTypeIds = nullptr, const QMetaObject *classInfoMetaObject = nullptr) { qmlRegisterNamespaceAndRevisions(metaObject, uri, versionMajor, qmlTypeIds, classInfoMetaObject, nullptr); } int Q_QML_EXPORT qmlTypeId(const char *uri, int versionMajor, int versionMinor, const char *qmlName); QT_END_NAMESPACE #endif // QQML_H