diff options
Diffstat (limited to 'src/qml/qml/qqml.h')
-rw-r--r-- | src/qml/qml/qqml.h | 71 |
1 files changed, 35 insertions, 36 deletions
diff --git a/src/qml/qml/qqml.h b/src/qml/qml/qqml.h index 1695a78bbf..3e6441bfa7 100644 --- a/src/qml/qml/qqml.h +++ b/src/qml/qml/qqml.h @@ -133,8 +133,16 @@ void qmlRegisterAnonymousTypesAndRevisions(const char *uri, int versionMajor) 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); + const char *qmlName, const QString &message); template<typename T> int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason) @@ -662,37 +670,25 @@ QObject *qmlAttachedPropertiesObject(const QObject *obj, bool create = true) return qmlAttachedPropertiesObject(const_cast<QObject *>(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 <typename T> -inline int qmlRegisterSingletonType( - const char *uri, int versionMajor, int versionMinor, const char *typeName, - QObject *(*callback)(QQmlEngine *, QJSEngine *)) +#ifdef Q_QDOC +int qmlRegisterSingletonType( + const char *uri, int versionMajor, int versionMinor, const char *typeName, + std::function<QJSValue(QQmlEngine *, QJSEngine *)> callback) +#else +template<typename F, typename std::enable_if<std::is_convertible<F, std::function<QJSValue(QQmlEngine *, QJSEngine *)>>::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<F>(callback), nullptr, - callback, - QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), - QQmlPrivate::QmlMetaType<T>::self(), + nullptr, + QMetaType(), nullptr, nullptr, QTypeRevision::zero() }; @@ -702,12 +698,13 @@ inline int qmlRegisterSingletonType( #ifdef Q_QDOC template <typename T> -int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, std::function<QObject*(QQmlEngine *, QJSEngine *)> callback) +int qmlRegisterSingletonType( + const char *uri, int versionMajor, int versionMinor, const char *typeName, + std::function<QObject *(QQmlEngine *, QJSEngine *)> callback) #else -template <typename T, typename F, typename std::enable_if<std::is_convertible<F, std::function<QObject *(QQmlEngine *, QJSEngine *)>>::value - && !std::is_convertible<F, QObject *(*)(QQmlEngine *, QJSEngine *)>::value, void>::type* = nullptr> -inline int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, - F&& callback) +template<typename T, typename F, typename std::enable_if<std::is_convertible<F, std::function<QObject *(QQmlEngine *, QJSEngine *)>>::value, void>::type* = nullptr> +int qmlRegisterSingletonType( + const char *uri, int versionMajor, int versionMinor, const char *typeName, F &&callback) #endif { QQmlPrivate::RegisterSingletonType api = { @@ -716,7 +713,7 @@ inline int qmlRegisterSingletonType(const char *uri, int versionMajor, int versi QTypeRevision::fromVersion(versionMajor, versionMinor), typeName, nullptr, - callback, + std::forward<F>(callback), QQmlPrivate::StaticMetaObject<T>::staticMetaObject(), QQmlPrivate::QmlMetaType<T>::self(), nullptr, nullptr, @@ -818,8 +815,8 @@ struct QmlTypeAndRevisionsRegistration<T, Resolved, Extended, false, false, fals } #else static_assert(QQmlPrivate::QmlMetaType<Resolved>::hasAcceptableCtors(), - "This type is neither a QObject, nor default- and copy-constructible, nor" - "uncreatable.\n" + "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<QObject, Resolved> || !QQmlTypeInfo<Resolved>::hasAttachedProperties); @@ -871,12 +868,14 @@ struct QmlTypeAndRevisionsRegistration<T, Resolved, Extended, true, false, false { #if QT_DEPRECATED_SINCE(6, 4) // ### Qt7: Remove the warning, and leave only the static assert below. - if constexpr (!QQmlPrivate::QmlMetaType<Resolved>::hasAcceptableSingletonCtors()) { + if constexpr (QQmlPrivate::singletonConstructionMode<Resolved, T>() + == QQmlPrivate::SingletonConstructionMode::None) { QQmlPrivate::qmlRegistrationWarning(QQmlPrivate::UnconstructibleSingleton, QMetaType::fromType<Resolved>()); } #else - static_assert(QQmlPrivate::QmlMetaType<Resolved>::hasAcceptableSingletonCtors(), + static_assert(QQmlPrivate::singletonConstructionMode<Resolved, T>() + != 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"); @@ -920,7 +919,7 @@ void qmlRegisterTypesAndRevisions(const char *uri, int versionMajor, QList<int> QQmlPrivate::QmlSingleton<T>::Value, QQmlPrivate::QmlInterface<T>::Value, QQmlPrivate::QmlSequence<T>::Value, - QQmlPrivate::QmlUncreatable<T>::Value> + QQmlPrivate::QmlUncreatable<T>::Value || QQmlPrivate::QmlAnonymous<T>::Value> ::registerTypeAndRevisions(uri, versionMajor, qmlTypeIds, QQmlPrivate::QmlExtendedNamespace<T>::metaObject()), ...); } |