Project: Quick Future - Using QFuture in QML
-
Project: Quick Future
Source: https://github.com/benlau/quickfutureQuickFuture is a QML wrapper of QFuture. It allows user to access and listen from a QFuture object generated by a QObject class. So that QML could respond to the result of a threaded calculation.
Example
import Future 1.0 ... var future = FileActor.read(“tmp.txt”); // FileActor is a C++ class registered as context property // QFuture<QString> FileActor::read(const QString&file); // It is not a part of the library Future.onFinished(future, function(value) { // do something when it is finished. }); Future.promise(future).then(function(value) { // Future.promise creates a promise object by using Quick Promise. // It is useful when you have multiple asynchronous tasks pending. }); ...
Installation
qpm install quick.future.pri
Custom Type Registration
By default, QFuture<T> is not a standard type recognized by QML. It must be registered as a QMetaType per template type in order to get rid the error message.
The same rule applies in Quick Future too. Common types are pre-registered already.
For your own custom type, you can register it by:#include <QFFuture> Q_DECLARE_METATYPE(QFuture<CustomType>) ... int main(int argc, char *argv[]) { ... QFFuture::registerType<CustomType>(); ... }
Pre-registered data type list: bool, int, qreal, QString, QByteArray, QVariantMap, void.
API
(More API will be added upon request)
Future.isFinished(future)
Returns true if the asynchronous computation represented by this future has finished; otherwise returns false.
Future.onFinished(future, callback)
The callback will be invoked when the watched future finishes.
Future.promise(future)
Create a promise object which will be resolved when the future has finished. It must have QuickPromise installed and setup properly before using this function.
[Moved to Showcase ~kshegunov]
-
Pretty neat. Thanks for sharing!
-
Thanks for sharing. Your work is much appreciated!
-
v1.0.2 has been released!
Critical Changes
- The QML package name has been changed from
Future
toQuickFuture
import QuickFuture 1.0
- Custom type registration is done by
QuickFuture::registerType
instead ofQFFuture::registerType
#include <QuickFuture> Q_DECLARE_METATYPE(QFuture<CustomType>) ... int main(int argc, char *argv[]) { ... QuickFuture::registerType<CustomType>(); ... }
New API
Future.isRunning(future)
Future.isCanceled(future)
Future.onCanceled(future, callback)
Future.result(future)
Future.sync(future, propertyAtFuture, target, propertyAtTarget)
Synchronize a property in future object to target object.
Example:
QtObject { id: target1 property var isRunning property var isFinished } // Future.sync(future,"isRunning", target1, "isRunning"); // Future.sync(future,"isFinished", target1);
Supported properties: "isRunning", "isCanceled", "isFinished"
- The QML package name has been changed from
-
Quick Future v1.0.3 has been released. This version supports a custom type converter for making a QML friendly data structure from
QFuture<YourCustomType>
. Calling an async function and obtain the result from QML on a C++ class is much easier now.New Features
Custom Converter function
QuickFuture::registerType()
now supports to assign a custom converter for making a QML friendly data structure (e.g QVariantMap) from the custom type. The value could be obtained by using Future.result()class Actor : public QObject { Q_OBJECT public: class Reply { public: int code; QString message; }; QFuture<Reply> read(QString source); } static void init() { QuickFuture::registerType<Actor::Reply>([](Actor::Reply reply) -> QVariant { // Optional converter function. QVariantMap map; map["code"] = reply.code; map["message"] = reply.message; return map; }); } Q_COREAPP_STARTUP_FUNCTION(init)
var future = Actor.read(source); .... console.log(Future.result(future)); // Print { code: 0, message: ""} if the reply is empty