12

问候,

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

在此处输入图像描述 在此处输入图像描述

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

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

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

在此先感谢,

4

2 回答 2

6

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

您可能需要的是状态机和Command 设计模式的组合,在 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 中的状态机适用于跟踪用户界面的变化。
  • 命令设计模式适用于跟踪用户在底层模型中所做的更改。
于 2010-07-18T13:25:57.377 回答
2

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

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

于 2010-07-09T03:21:33.443 回答