@@ -2,3 +2,85 @@ This library has some usefull Qt classes and widgets to show asyncronious operat
2
2
3
3
[ ![ qt-async demo video] ( http://img.youtube.com/vi/aTXOpmVRXq0/0.jpg )] ( https://youtu.be/aTXOpmVRXq0 )
4
4
5
+ # Basic use
6
+
7
+ Declare async value object:
8
+ ``` C++
9
+ using AsyncQString = AsyncValue<QString>;
10
+ AsyncQString value (AsyncInitByValue{}, "Hello World!");
11
+ ```
12
+
13
+ When you need to calculate value, call one of the asyncXXX functions:
14
+ ```C++
15
+ asyncValueRunThreadPool(value, [](AsyncProgress& progress, AsyncQString& value) {
16
+
17
+ // a long calculations
18
+ for (auto i : {0, 1, 2, 3, 4})
19
+ {
20
+ // report progress
21
+ progress.setProgress(i, 5);
22
+ // check if calculation was stopped
23
+ if (progress.isStopRequested())
24
+ {
25
+ // report error
26
+ value.emplaceError("Stopped");
27
+ return;
28
+ }
29
+
30
+ QThread::sleep(1);
31
+ }
32
+
33
+ progress.setProgress(1.f);
34
+ progress.setMessage("Processing...");
35
+ QThread::sleep(1);
36
+
37
+ QString val = "Loaded value is 42";
38
+ // set calculated value
39
+ value.emplaceValue(std::move(val));
40
+
41
+ }, "Loading...", ASYNC_CAN_REQUEST_STOP::YES);
42
+ ```
43
+
44
+ Somewhere in GUI code declare async widget:
45
+ ``` C++
46
+ // create widget
47
+ auto valueWidget = new AsyncWidgetFn<AsyncQString>(ui->widget);
48
+
49
+ // set callback that creates widget to show value
50
+ valueWidget->createValueWidget = [](QString& value, QWidget* parent) {
51
+ // create QLabel
52
+ return AsyncWidgetProxy::createLabel(value, parent);
53
+ };
54
+
55
+ // optionally set callback that creates progress widget
56
+ valueWidget->createProgressWidget = [this](AsyncProgress& progress, QWidget* parent)->QWidget* {
57
+ return new AsyncWidgetProgressSpinner(progress, parent);
58
+ };
59
+
60
+ // optionally set callback that creates error widget
61
+ valueWidget->createProgressWidget = [this](AsyncError& error, QWidget* parent)->QWidget* {
62
+ return new AsyncWidgetError(error, parent);
63
+ };
64
+
65
+ // assign value with widget
66
+ valueWidget->setValue(&m_value);
67
+ ```
68
+
69
+ Instead of callbacks you can derive widget class from AsyncWidgetBase or AsyncWidget classes and override four functions:
70
+
71
+ ```C++
72
+ // creates widget to show value
73
+ virtual QWidget* createValueWidgetImpl(ValueType& value, QWidget* parent) = 0;
74
+
75
+ // creates widget to show error
76
+ virtual QWidget* createErrorWidgetImpl(ErrorType& error, QWidget* parent) = 0;
77
+
78
+ // creates widget to show progress
79
+ virtual QWidget* createProgressWidgetImpl(ProgressType& progress, QWidget* parent) = 0;
80
+
81
+ // create widget when no value has been assigned
82
+ virtual QWidget* createNoAsyncValueWidgetImpl(QWidget* parent) { return createLabel("<no value>", parent); }
83
+
84
+ ```
85
+
86
+ # Rerunnable values
0 commit comments