Skip to content

Commit 6b05dc6

Browse files
authored
Update README.md
1 parent 933e2df commit 6b05dc6

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed

README.md

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,85 @@ This library has some usefull Qt classes and widgets to show asyncronious operat
22

33
[![qt-async demo video](http://img.youtube.com/vi/aTXOpmVRXq0/0.jpg)](https://youtu.be/aTXOpmVRXq0)
44

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

Comments
 (0)