aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqml.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/qml/qqml.h')
-rw-r--r--src/qml/qml/qqml.h71
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()), ...);
}