【问题标题】:QT : Using State Machine for UI interactions?QT:使用状态机进行 UI 交互?
【发布时间】:2011-03-13 16:06:39
【问题描述】:

您好,

我们正在开发一个检测单元格边界的科学 QT 应用程序。请参考以下原型快照。

现在,我们将把它开发为具有良好设计和架构的开源产品。我们发现它有许多复杂的动作和流程。 例如:移动轮廓节点、删除轮廓节点、添加轮廓节点、绘制障碍、选择多个节点...等

我们希望为 UI 使用 QT 状态机框架,并且想知道是为每个流程/动作使用多个状态机实例还是使用一个“巨大的”状态机? 我们需要撤消/重做操作,是否可以将 QT 状态机框架与 QT 撤消/重做框架交互?

[编辑] 真的可以使用 QT SM 框架来处理 UI 交互吗? 他们在 GIMP 或 CAD 应用程序中使用什么样的设计?

提前致谢, 漫画

【问题讨论】:

  • 非常有趣的问题。我也经常想知道如何使用 Qt 的状态机框架来控制 UI 交互。

标签: qt user-interface architecture state-machine undo


【解决方案1】:

我相信状态机并不是代表用户交互的正确选择。它适用于轻松地对用户界面本身的变化进行建模。

您可能需要的是状态机和 Command design pattern 的组合,在 Qt 中它部分地由 QUndoStack 和 QUndoCommand 类实现。状态机跟踪用户界面本身的变化,命令类跟踪用户交互。我对检测单元格边界知之甚少,也不知道您是如何规划应用程序中的交互模型的,但让我尝试一个虚构的示例来澄清一下。

示例

假设您的应用有两种不同的算法来检测从用户提供的粗略估计开始的单元格边界。一个人在细胞周围采用粗略的逐点路径。另一个采用手绘轮廓。您还希望允许用户向单元格图像添加标注注释。假设您也不想让用户的屏幕被她现在不会使用的工具弄得杂乱无章。

然后,您将拥有三种不同的交互模式,并且每种模式都有用户可以使用的不同操作(或工具):

  1. 逐点。用户可以添加点、删除点、移动点、选择点和细化边框。
  2. 手绘。用户可以使用“铅笔”和“橡皮擦”绘制并细化边框。
  3. 标注注释。用户可以添加注释、删除注释、移动注释、重新定位注释箭头以及编辑注释文本。

除了提供工具外,前两种模式还可能允许用户调整算法的参数。

一种方法是将 1、2 和 3 中的每一个表示为状态机中的一个状态。在进入其中一种状态时,它会导致工具变得可见。当一个状态退出时,它会隐藏它的工具。例如,可以使用工具栏按钮来更改状态。

现在,当使用一个工具并更改下面的模型时,它还会在 QUndoStack 中存储一个 QUndoCommand。假设用户处于手绘模式。现在她切换到点对点模式,调整参数,添加两个点,移动一个点,然后删除它。撤消堆栈可能如下所示,从下到上:

  1. 从手绘模式切换到点对点模式
  2. 将参数 ε 从 0.00001 更改为 0.002
  3. 在 (120, 40) 处添加点 #1
  4. 在 (403, 11) 处添加点 #2
  5. 将点 #1 从 (120, 40) 移动到 (350, 120)
  6. 删除点 #1

请注意,状态更改已添加到撤消堆栈中,因此撤消一系列命令会使用户在发出命令时准确地留在原处。例如,如果她一直取消到 1,她将回到徒手模式。

总结一下

  • Qt 中的状态机适用于跟踪用户界面的变化。
  • 命令设计模式适用于跟踪用户在底层模型中所做的更改。

【讨论】:

  • 感谢 andref 的详细回答。我现在完全按照您的描述实现。我使用状态机来处理状态并使用 QTs Undo Framework。
【解决方案2】:

我们已经尝试使用 Qt 的状态机框架和动画框架来实现简单的 UI 转换。我相信在他们的文档或他们的网站上有如何做到这一点的教程或示例。所以是的,这是可能的。

我不知道它的扩展性或最佳架构。如果是我,我会尝试使用很多简单的状态机,利用它们的分层功能。

【讨论】:

  • +1 我对 QT 一无所知,但是将大问题分解为更小(更容易管理)的想法绝对是一个很好的工作原则。
猜你喜欢
  • 2014-05-12
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 2017-10-01
  • 2016-01-17
相关资源
最近更新 更多