任务树演示
演示不同的执行模式和工作流策略如何影响复杂的 TaskTree 执行。
TaskTree 演示展示了如何使用timeoutTask 构建嵌套的 TaskTree 配方,并演示了不同的execution modes 和workflow policies 。其应用程序以图形方式概述了 TaskTree 在执行组成任务的各个工作项时的进度。

演示应用程序使用单个 QWidget 来显示和管理 TaskTree 层次结构。下面是界面中的内容:
- 任务以叶节点的形式出现在树的右侧。
您可以为每个任务设置执行期限,并配置成功或错误的完成状态。
- 组节点出现在树的左边和中间。
每个组可包含多个子任务或嵌套组。您可以为每个组配置execution modes 和workflow policies 。
- 颜色指示器显示每个节点的当前执行状态。
下面几节将介绍示例代码的更多细节。
辅助胶水类
GlueItem 抽象类将用户界面(UI)组件与相应的任务树配方连接起来。通过这种设计模式,用户界面和任务逻辑之间实现了清晰的分离。
class GlueItem { public: virtual ExecutableItem recipe() const = 0; virtual QWidget *widget() const = 0; virtual void reset() const = 0; virtual ~GlueItem() = default; };
GlueItem 类定义了三个关键的虚拟方法:
| 方法 | 目的 |
|---|---|
recipe() | 创建并返回定义项目行为的 TaskTree 配方 |
widget() | 提供对相关用户界面组件的访问 |
reset() | 将用户界面组件恢复到初始状态 |
GroupGlueItem 类管理任务层次结构中的Group 元素。每个组都可以将其他GlueItem 元素作为子元素,包括嵌套的GroupGlueItems 或TaskGlueItems。
下面是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 ,并包含子菜单
- 应用用户界面设置中的execution mode 和workflow policy
- 开始执行时使用onGroupSetup() 更新用户界面
- 使用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
- 使用用户界面设置配置持续时间和预期结果
- 当任务开始时,通过onGroupSetup() 更新用户界面状态
- 通过onGroupDone() 反映任务完成状态
构建任务层次结构
两个辅助方法简化了任务树的创建:
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() }) };
您可以修改上述结构来创建不同的树形结构。
将用户界面与 TaskTree 连接起来
最后一步是将任务树与应用程序的用户界面控件连接起来:
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: 教程:构建并运行。
© 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.