/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtQml module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or (at your option) the GNU General ** Public license version 3 or any later version approved by the KDE Free ** Qt Foundation. The licenses are as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-2.0.html and ** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QQML_H #define QQML_H #include #include #include #include #include #include #define QML_VERSION 0x020000 #define QML_VERSION_STR "2.0" #define QML_PRIVATE_NAMESPACE \ QT_PREPEND_NAMESPACE(QQmlPrivate) #define QML_REGISTER_TYPES_AND_REVISIONS \ QT_PREPEND_NAMESPACE(qmlRegisterTypesAndRevisions) #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) #define QML_ELEMENT \ Q_CLASSINFO("QML.Element", "auto") #define QML_ANONYMOUS \ Q_CLASSINFO("QML.Element", "anonymous") #define QML_NAMED_ELEMENT(NAME) \ Q_CLASSINFO("QML.Element", #NAME) #define QML_VALUE_TYPE(NAME) \ Q_CLASSINFO("QML.Element", #NAME) \ QML_UNCREATABLE("Value types cannot be created.") #define QML_UNCREATABLE(REASON) \ Q_CLASSINFO("QML.Creatable", "false") \ Q_CLASSINFO("QML.UncreatableReason", REASON) #define QML_SINGLETON \ Q_CLASSINFO("QML.Singleton", "true") \ enum class QmlIsSingleton {yes = true}; \ template friend struct QML_PRIVATE_NAMESPACE::QmlSingleton; \ template \ friend void QML_REGISTER_TYPES_AND_REVISIONS(const char *uri, int versionMajor, QList *); #define QML_SEQUENTIAL_CONTAINER(VALUE_TYPE) \ Q_CLASSINFO("QML.Sequence", #VALUE_TYPE) \ using QmlSequenceValueType = VALUE_TYPE; \ enum class QmlIsSequence {yes = true}; \ template friend struct QML_PRIVATE_NAMESPACE::QmlSequence; \ template \ friend void QML_REGISTER_TYPES_AND_REVISIONS(const char *uri, int versionMajor, QList *); #define QML_ADDED_IN_MINOR_VERSION(VERSION) \ Q_CLASSINFO("QML.AddedInVersion", Q_REVISION(VERSION)) #define QML_ADDED_IN_VERSION(MAJOR, MINOR) \ Q_CLASSINFO("QML.AddedInVersion", Q_REVISION(MAJOR, MINOR)) #define QML_REMOVED_IN_MINOR_VERSION(VERSION) \ Q_CLASSINFO("QML.RemovedInVersion", Q_REVISION(VERSION)) #define QML_REMOVED_IN_VERSION(MAJOR, MINOR) \ Q_CLASSINFO("QML.RemovedInVersion", Q_REVISION(MAJOR, MINOR)) #define QML_ATTACHED(ATTACHED_TYPE) \ Q_CLASSINFO("QML.Attached", #ATTACHED_TYPE) \ using QmlAttachedType = ATTACHED_TYPE; \ template friend struct QML_PRIVATE_NAMESPACE::QmlAttached; \ template friend struct QML_PRIVATE_NAMESPACE::QmlAttachedAccessor; #define QML_EXTENDED(EXTENDED_TYPE) \ Q_CLASSINFO("QML.Extended", #EXTENDED_TYPE) \ using QmlExtendedType = EXTENDED_TYPE; \ template friend struct QML_PRIVATE_NAMESPACE::QmlExtended; \ template \ friend void QML_REGISTER_TYPES_AND_REVISIONS(const char *uri, int versionMajor, QList *); #define QML_EXTENDED_NAMESPACE(EXTENDED_NAMESPACE) \ Q_CLASSINFO("QML.Extended", #EXTENDED_NAMESPACE) \ static constexpr const QMetaObject *qmlExtendedNamespace() { return &EXTENDED_NAMESPACE::staticMetaObject; } \ template friend struct QML_PRIVATE_NAMESPACE::QmlExtendedNamespace; \ template \ friend void QML_REGISTER_TYPES_AND_REVISIONS(const char *uri, int versionMajor, QList *); #define QML_FOREIGN(FOREIGN_TYPE) \ Q_CLASSINFO("QML.Foreign", #FOREIGN_TYPE) \ using QmlForeignType = FOREIGN_TYPE; \ template friend struct QML_PRIVATE_NAMESPACE::QmlResolved; \ template \ friend void QML_REGISTER_TYPES_AND_REVISIONS(const char *uri, int versionMajor, QList *); #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}; \ template friend struct QML_PRIVATE_NAMESPACE::QmlInterface; \ template \ friend void QML_REGISTER_TYPES_AND_REVISIONS(const char *uri, int versionMajor, QList *); #define QML_IMPLEMENTS_INTERFACES(INTERFACES) \ Q_INTERFACES(INTERFACES) \ enum class QmlIsInterface {yes = false}; #define QML_UNAVAILABLE \ QML_FOREIGN(QQmlTypeNotAvailable) 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 = { 0, 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() }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } 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 = { 0, 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() }; 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 = { 0, 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) }; 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 = { 0, 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() }; 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 = { 0, 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) }; 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) { QQmlPrivate::RegisterType type = { 0, 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() }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } template int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName) { QQmlPrivate::RegisterType type = { 0, 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) }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } template int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor) { QQmlPrivate::RegisterType type = { 0, 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) }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } template int qmlRegisterExtendedType(const char *uri, int versionMajor) { QQmlPrivate::RegisterType type = { 0, 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() }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } template int qmlRegisterExtendedType(const char *uri, int versionMajor, int versionMinor, const char *qmlName) { QQmlAttachedPropertiesFunc attached = QQmlPrivate::attachedPropertiesFunc(); const QMetaObject * attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject(); if (!attached) { attached = QQmlPrivate::attachedPropertiesFunc(); attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject(); } QQmlPrivate::RegisterType type = { 0, 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() }; 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) { QQmlPrivate::RegisterType type = { 0, 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() }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } template int qmlRegisterCustomType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, QQmlCustomParser *parser) { QQmlPrivate::RegisterType type = { 0, 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) }; return QQmlPrivate::qmlregister(QQmlPrivate::TypeRegistration, &type); } template int qmlRegisterCustomExtendedType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, QQmlCustomParser *parser) { QQmlAttachedPropertiesFunc attached = QQmlPrivate::attachedPropertiesFunc(); const QMetaObject * attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject(); if (!attached) { attached = QQmlPrivate::attachedPropertiesFunc(); attachedMetaObject = QQmlPrivate::attachedPropertiesMetaObject(); } QQmlPrivate::RegisterType type = { 0, 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() }; 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); //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); } inline int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QJSValue (*callback)(QQmlEngine *, QJSEngine *)) { QQmlPrivate::RegisterSingletonType api = { 0, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), typeName, callback, nullptr, nullptr, QMetaType(), nullptr, nullptr, QTypeRevision::zero() }; return QQmlPrivate::qmlregister(QQmlPrivate::SingletonRegistration, &api); } template inline int qmlRegisterSingletonType( const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *(*callback)(QQmlEngine *, QJSEngine *)) { QQmlPrivate::RegisterSingletonType api = { 0, uri, QTypeRevision::fromVersion(versionMajor, versionMinor), typeName, nullptr, callback, QQmlPrivate::StaticMetaObject::staticMetaObject(), QQmlPrivate::QmlMetaType::self(), 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 && !std::is_convertible::value, void>::type* = nullptr> inline 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, 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::SingletonFunctor 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) { 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) { QQmlPrivate::qmlRegisterTypeAndRevisions( uri, versionMajor, QQmlPrivate::StaticMetaObject::staticMetaObject(), qmlTypeIds, extension); } }; template struct QmlTypeAndRevisionsRegistration { static void registerTypeAndRevisions(const char *uri, int versionMajor, QList *qmlTypeIds, const QMetaObject *) { QQmlPrivate::qmlRegisterSequenceAndRevisions( uri, versionMajor, QQmlPrivate::StaticMetaObject::staticMetaObject(), qmlTypeIds); } }; template struct QmlTypeAndRevisionsRegistration { static void registerTypeAndRevisions(const char *uri, int versionMajor, QList *qmlTypeIds, const QMetaObject *extension) { 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 = nullptr); 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> ::registerTypeAndRevisions(uri, versionMajor, qmlTypeIds, QQmlPrivate::QmlExtendedNamespace::metaObject()); qmlRegisterTypesAndRevisions(uri, versionMajor, qmlTypeIds); } template<> inline void qmlRegisterTypesAndRevisions<>(const char *, int, QList *) { } inline void qmlRegisterNamespaceAndRevisions(const QMetaObject *metaObject, const char *uri, int versionMajor, QList *qmlTypeIds = nullptr, const QMetaObject *classInfoMetaObject = nullptr) { QQmlPrivate::RegisterTypeAndRevisions type = { 0, QMetaType(), QMetaType(), 0, nullptr, nullptr, nullptr, uri, QTypeRevision::fromMajorVersion(versionMajor), metaObject, (classInfoMetaObject ? classInfoMetaObject : metaObject), nullptr, nullptr, -1, -1, -1, nullptr, nullptr, &qmlCreateCustomParser, qmlTypeIds }; qmlregister(QQmlPrivate::TypeAndRevisionsRegistration, &type); } int Q_QML_EXPORT qmlTypeId(const char *uri, int versionMajor, int versionMinor, const char *qmlName); QT_END_NAMESPACE #endif // QQML_H