QT:使用状态机进行UI交互?

时间:2010-07-09 02:25:12

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

问候,

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

enter image description here enter image description here

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

我们希望为UI使用QT状态机框架,并想知道是否为每个流/动作使用多个状态机实例或使用一个“巨大的”状态机? 我们需要unde / redo操作,是否可以将QT State-Machine Framework与QT Undo / Redo Framework进行交互?

[edit]是否真的可以使用QT SM Framekwork来处理UI交互? 他们在GIMP或CAD应用程序中使用什么样的设计?

提前致谢, umanga

2 个答案:

答案 0 :(得分:5)

我认为状态机实际上不是代表用户交互的正确选择。它适用于轻松模拟用户界面本身的更改。

您可能需要的是状态机和 Command design pattern 的组合,Qt中的部分由QUndoStack和QUndoCommand类实现。状态机跟踪用户界面本身的更改,Command类跟踪用户交互。我不太了解检测细胞边界的情况,我不知道你是如何计划你的应用程序中的交互模型的,但是让我尝试一个假设的例子来澄清。

实施例

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

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

  1. 逐点。用户可以添加点,移除点,移动点,选择点以及细化边框。
  2. Freehand。用户可以使用“铅笔”和“橡皮擦”进行绘制并优化边框。
  3. 标注注释。用户可以添加注释,删除注释,移动注释,重新定位注释的箭头,以及编辑注释的文本。
  4. 除了提供工具外,前两种模式还可以允许用户调整算法的参数。

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

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

    1. 从徒手模式切换到点对点模式
    2. 将参数ε从0.00001更改为0.002
    3. 在(120,40)
    4. 添加#1点
    5. 在(403,11)
    6. 添加#2点
    7. 将点#1从(120,40)移动到(350,120)
    8. 删除第1点
    9. 请注意,状态更改已添加到撤消堆栈中,因此撤消一系列命令会使用户完全脱离发布时的位置。例如,如果她一直没有回到1,她将回到徒手模式。

      总结一下

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

答案 1 :(得分:2)

我们已经尝试使用Qt的状态机框架和动画框架进行简单的UI转换。我相信有关于如何在他们的文档或他们的网站上执行此操作的教程或示例。是的,这是可能的。

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