タスクツリーのデモ
異なる実行モードとワークフロー ポリシーが複雑な TaskTree の実行にどのように影響するかをデモします。
TaskTree Demoは、timeoutTask を使用してネストされた TaskTree レシピを構築する方法を示し、さまざまなexecution modes とworkflow policies をデモします。そのアプリケーションは、TaskTree がタスクを構成するさまざまなワークアイテムを実行するときに、進捗のグラフィカルな概要を提供します。

デモ・アプリケーションでは、1 つの 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 を適用します。
- 実行開始時に UI を更新するためにonGroupSetup() を使用します。
- 実行結果を UI に反映するためにonGroupDone() を使用する
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:Tutorialを参照してください:ビルドと実行。
© 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.