TaskTree デモ
さまざまな実行モードやワークフローポリシーが、複雑なTaskTreeの実行にどのような影響を与えるかを示します。
TaskTree デモでは、timeoutTask を使用してネストされた TaskTree レシピを構築する方法を示し、さまざまなexecution modes およびworkflow policies を実演します。このアプリケーションでは、TaskTree がタスクを構成するさまざまな作業項目を実行する過程の進捗状況をグラフィカルに把握できます。

このデモアプリケーションでは、単一の QWidget を使用して TaskTree の階層構造を表示・管理しています。インターフェースには以下の要素が表示されます。
- タスクは、ツリーの右側にあるリーフノードとして表示されます。
各タスクについて、実行期間を設定したり、成功またはエラーの完了状態を構成したりすることができます。
- グループノードは、ツリーの左側と中央に表示されます。
各グループには、複数の子タスクやネストされたグループを含めることができます。各グループに対して、execution modes およびworkflow policies を設定できます。
- 色によるインジケータは、各ノードの現在の実行状態を示します。
以下のセクションでは、この例のコードについてさらに詳しく説明します。
ヘルパークルークラス
GlueItem 抽象クラスは、ユーザーインターフェース(UI)コンポーネントと、それに対応する TaskTree レシピを結びつけます。この設計パターンにより、UI とタスクロジックを明確に分離することができます。
class GlueItem
{
public:
virtual ExecutableItem recipe() const = 0;
virtual QWidget *widget() const = 0;
virtual void reset() const = 0;
virtual ~GlueItem() = default;
};GlueItem クラスは、3つの主要な仮想メソッドを定義しています。
| メソッド | 目的 |
|---|---|
recipe() | アイテムの挙動を定義するTaskTreeレシピを作成して返す |
widget() | 関連するUIコンポーネントへのアクセスを提供します |
reset() | UIコンポーネントを初期状態に復元します |
GroupGlueItem クラスは、タスク階層内のGroup 要素を管理します。各グループは、ネストされたGroupGlueItemやTaskGlueItemを含め、他のGlueItem 要素を子要素として保持できます。
recipe() メソッドがグループを作成および設定する手順は次のとおりです。
ExecutableItem GroupGlueItem::recipe() const
{
GroupItems childRecipes;
for (GlueItem *child : m_children)
childRecipes.append(child->recipe());
return Group {
m_groupWidget->executeModeItem(),
m_groupWidget->workflowPolicyItem(),
onGroupSetup([this] { m_groupWidget->setState(State::Running); }),
childRecipes,
onGroupDone([this](DoneWith result) { m_groupWidget->setState(resultToState(result)); })
};
}実装の主な構成要素:
- 子レシピを持つ新しいGroup を作成します
- UI設定からexecution mode およびworkflow policy を適用する
- onGroupSetup() を使用して、実行開始時に UI を更新する
- onGroupDone() を使用して、実行結果を UI に反映する
TaskGlueItem クラスは、timeoutTask を使用して、タスクツリー内のリーフノードを実装します。
以下は、タスクを作成する `recipe() ` の実装です:
ExecutableItem TaskGlueItem::recipe() const
{
return Group {
onGroupSetup([this] { m_taskWidget->setState(State::Running); }),
timeoutTask(seconds(m_taskWidget->busyTime()), m_taskWidget->desiredResult()),
onGroupDone([this](DoneWith result) { m_taskWidget->setState(resultToState(result)); })
};
}実装内容:
- Group を作成し、その中にtimeoutTask
- UI設定を使用して、所要時間と期待される結果を構成します
- onGroupSetup() を通じて、タスクの開始時に UI の状態を更新します
- onGroupDone() を通じてタスクの完了状態を反映する
タスク階層の構築
2つのヘルパーメソッドにより、タスクツリーの作成が簡略化されます:
static GlueItem *group(const GroupSetup &groupSetup, const QList<GlueItem *> children)
{
return new GroupGlueItem(groupSetup, children);
}
static GlueItem *task(int busyTime = 1, DoneResult result = DoneResult::Success)
{
return new TaskGlueItem(busyTime, result);
}group(): 新しいGroupGlueItemtask(): 新しいTaskGlueItem
ツリー構造の定義
以下のコードは、完全なタスク階層を構築する方法を示しています:
std::unique_ptr<GlueItem> tree {
group({WorkflowPolicy::ContinueOnSuccess}, {
group({}, {
task(),
task(2, DoneResult::Error),
task(3)
}),
task(),
task(),
group({WorkflowPolicy::FinishAllAndSuccess}, {
task(),
task(),
group({WorkflowPolicy::StopOnError, ExecuteMode::Parallel}, {
task(4),
task(2),
task(1),
task(3, DoneResult::Error)
}),
task(2),
task(3)
}),
task()
})
};上記の構造を変更することで、さまざまなツリー構造を作成できます。
UIとTaskTreeの連携
最後のステップでは、タスクツリーをアプリケーションの UI コントロールに接続します:
QSingleTaskTreeRunner taskTreeRunner;
const auto resetTaskTree = [&] {
taskTreeRunner.reset();
tree->reset();
progressBar->setValue(0);
cancelButton->setEnabled(false);
};
const auto cancelTaskTree = [&] { taskTreeRunner.cancel(); };
const auto startTaskTree = [&] {
resetTaskTree();
cancelButton->setEnabled(true);
const auto onTaskTreeSetup = [progressBar](QTaskTree &taskTree) {
progressBar->setMaximum(taskTree.progressMaximum());
QObject::connect(&taskTree, &QTaskTree::progressValueChanged,
progressBar, &QProgressBar::setValue);
};
const auto onTaskTreeDone = [cancelButton] { cancelButton->setEnabled(false); };
taskTreeRunner.start({tree->recipe()}, onTaskTreeSetup, onTaskTreeDone);
};
QObject::connect(startButton, &QAbstractButton::clicked, &app, startTaskTree);
QObject::connect(cancelButton, &QAbstractButton::clicked, &app, cancelTaskTree);
QObject::connect(resetButton, &QAbstractButton::clicked, &app, resetTaskTree);
mainWidget.show();
return app.exec();このコードは:
- タスクツリーを実行するための QSingleTaskTreeRunner を作成します
- 「開始」、「キャンセル」、「リセット」ボタンのハンドラを設定します
- タスクの実行状況を追跡するためにプログレスバーを接続します
例の動作確認
以下の手順でサンプルを実行できます:
- Qt Creator
Welcome モードを開き、Examples からこのサンプルを選択します。詳細については、Qt Creator の「チュートリアル:ビルドと実行」を参照してください。
- Qt Extension for Visual Studio Code
Command Palette から「Qt: Open Qt examples 」コマンドを実行し、リストからサンプルを選択します。詳細については、Qt Extension for Visual Studio Code の「チュートリアル: ビルドと実行」を参照してください。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.