我相信状态机并不是代表用户交互的正确选择。它适用于轻松地对用户界面本身的更改进行建模。
您可能需要的是状态机和Command 设计模式的组合,在 Qt 中它部分地由 QUndoStack 和 QUndoCommand 类实现。状态机跟踪用户界面本身的变化,命令类跟踪用户交互。我不太了解检测单元格边界,也不知道您是如何规划应用程序中的交互模型的,但让我尝试一个虚构的示例来澄清一下。
例子
假设您的应用程序有两种不同的算法来检测从用户提供的粗略估计开始的单元格边界。一个人在细胞周围采用粗略的逐点路径。另一个采用手绘轮廓。您还希望允许用户向单元格图像添加标注注释。假设您也不想用她现在不会使用的工具来弄乱用户的屏幕。
然后,您将拥有三种不同的交互模式,并且每种模式都有用户可以使用的不同操作(或工具):
- 一点一点。用户可以添加一个点、删除一个点、移动一个点、选择点和细化边界。
- 手绘。用户可以用“铅笔”和“橡皮擦”绘制并细化边框。
- 标注注释。用户可以添加注释、删除注释、移动注释、重新定位注释箭头以及编辑注释文本。
除了提供工具外,前两种模式还可能允许用户调整算法的参数。
一种方法是将 1、2 和 3 中的每一个表示为状态机中的状态。在进入其中一种状态时,它会导致工具变得可见。当一个状态退出时,它会隐藏它的工具。例如,可以使用工具栏按钮来更改状态。
现在,当使用一个工具并更改下面的模型时,它还会在 QUndoStack 中存储一个 QUndoCommand。假设用户处于手绘模式。现在她切换到点对点模式,调整参数,添加两个点,移动一个点,然后删除它。撤消堆栈可能如下所示,从下到上:
- 从手绘模式切换到点对点模式
- 将参数ε从 0.00001 更改为 0.002
- 在 (120, 40) 处添加点 #1
- 在 (403, 11) 处添加点 #2
- 将点 #1 从 (120, 40) 移动到 (350, 120)
- 删除点 #1
请注意,状态更改已添加到撤消堆栈中,因此撤消一系列命令会使用户准确地离开她发出命令时的位置。例如,如果她一直取消到 1,她将回到徒手模式。
总结一下
- Qt 中的状态机适用于跟踪用户界面的变化。
- 命令设计模式适用于跟踪用户在底层模型中所做的更改。