summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/kernel/qmetatype.h11
-rw-r--r--src/corelib/thread/qfuture.h20
-rw-r--r--tests/auto/corelib/thread/qfuture/tst_qfuture.cpp18
3 files changed, 49 insertions, 0 deletions
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h
index 019a85c12a..adc4ae92d5 100644
--- a/src/corelib/kernel/qmetatype.h
+++ b/src/corelib/kernel/qmetatype.h
@@ -1092,6 +1092,14 @@ namespace QtPrivate
static bool registerConverter() { return false; }
};
+#if QT_CONFIG(future)
+ template<typename T>
+ struct MetaTypeQFutureHelper
+ {
+ static bool registerConverter() { return false; }
+ };
+#endif
+
Q_CORE_EXPORT bool isBuiltinType(const QByteArray &type);
} // namespace QtPrivate
@@ -1218,6 +1226,9 @@ int qRegisterNormalizedMetaType(const QT_PREPEND_NAMESPACE(QByteArray) &normaliz
QtPrivate::AssociativeContainerTransformationHelper<T>::registerMutableView();
QtPrivate::MetaTypePairHelper<T>::registerConverter();
QtPrivate::MetaTypeSmartPointerHelper<T>::registerConverter();
+#if QT_CONFIG(future)
+ QtPrivate::MetaTypeQFutureHelper<T>::registerConverter();
+#endif
if (normalizedTypeName != metaType.name())
QMetaType::registerNormalizedTypedef(normalizedTypeName, metaType);
diff --git a/src/corelib/thread/qfuture.h b/src/corelib/thread/qfuture.h
index ab08f7861c..094b3471b8 100644
--- a/src/corelib/thread/qfuture.h
+++ b/src/corelib/thread/qfuture.h
@@ -43,6 +43,7 @@
#include <QtCore/qglobal.h>
#include <QtCore/qfutureinterface.h>
+#include <QtCore/qmetatype.h>
#include <QtCore/qstring.h>
#include <QtCore/qfuture_impl.h>
@@ -438,8 +439,27 @@ QFutureInterfaceBase QFutureInterfaceBase::get(const QFuture<T> &future)
return future.d;
}
+namespace QtPrivate
+{
+
+template<typename T>
+struct MetaTypeQFutureHelper<QFuture<T>>
+{
+ static bool registerConverter() {
+ if constexpr (std::is_same_v<T, void>)
+ return false;
+
+ return QMetaType::registerConverter<QFuture<T>, QFuture<void>>(
+ [](const QFuture<T> &future) { return QFuture<void>(future); });
+ }
+};
+
+} // namespace QtPrivate
+
Q_DECLARE_SEQUENTIAL_ITERATOR(Future)
QT_END_NAMESPACE
+Q_DECLARE_METATYPE_TEMPLATE_1ARG(QFuture)
+
#endif // QFUTURE_H
diff --git a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp
index 8eadaee62a..af83ee3b95 100644
--- a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp
+++ b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp
@@ -164,6 +164,7 @@ private slots:
void createReadyFutures();
void getFutureInterface();
+ void convertQMetaType();
private:
using size_type = std::vector<int>::size_type;
@@ -3532,5 +3533,22 @@ void tst_QFuture::getFutureInterface()
QCOMPARE(interface.resultCount(), 1);
}
+void tst_QFuture::convertQMetaType()
+{
+ const auto intType = QMetaType::fromType<QFuture<int>>();
+ const auto voidType = QMetaType::fromType<QFuture<void>>();
+
+ QVERIFY(QMetaType::canConvert(intType, voidType));
+
+ const int val = 42;
+ QFuture<int> f = QtFuture::makeReadyFuture(val);
+ auto variant = QVariant::fromValue(f);
+ QVERIFY(variant.convert(voidType));
+
+ const auto voidFuture = variant.value<QFuture<void>>();
+ QVERIFY(voidFuture.isValid());
+ QVERIFY(voidFuture.isFinished());
+}
+
QTEST_MAIN(tst_QFuture)
#include "tst_qfuture.moc"