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

12

问候,

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

enter image description here enter image description here

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

我们希望使用 QT 状态机框架来处理用户界面,并想知道是否应该为每个流程/操作使用几个状态机实例,还是使用一个“巨大”的状态机?我们需要撤消/重做操作,能否将 QT 状态机框架与 QT 撤消/重做框架结合使用?

[编辑] 是否真的可以使用 QT 状态机框架来处理用户界面交互?GIMP 或 CAD 应用程序中使用何种设计?

提前致谢, umanga


非常有趣的问题。我经常想知道是否可以使用Qt的状态机框架来控制UI交互。 - Casey
2个回答

6
我认为状态机并不是表示用户交互的正确选择。它适用于轻松地对用户界面本身进行建模。
您可能需要的是状态机和Command设计模式的组合,Qt中部分实现了QUndoStack和QUndoCommand类。状态机跟踪用户界面本身的更改,而Command类跟踪用户交互。我不太了解如何检测单元格边框,也不知道您计划在应用程序中如何进行交互模型,但让我试着举一个虚构的例子来澄清一下。
例子
假设您的应用程序有两种不同的算法来检测从用户提供的粗略估计开始的单元格边框。其中一种采用粗略的逐点路径绕过单元格。另一种则采用自由手轮廓。您还希望允许用户向单元格图像添加标注说明。假设您也不想在用户屏幕上放置她现在不会使用的工具。
然后,您就有了三种不同的交互模式,每种模式都有不同的操作(或工具)可供用户使用:
  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提供详细的答案。我现在正在按照您描述的方式实现。我使用状态机来处理状态,并使用QT的撤销框架。 - Ashika Umanga Umagiliya

2
我们尝试了Qt的状态机框架和动画框架来进行简单的UI过渡。我相信他们的文档或网站上有如何完成这个操作的教程或示例。所以,是可以实现的。
我不知道它的可扩展性或最佳架构如何。如果是我,我会尝试使用许多简单的状态机,充分利用它们的层次结构能力。

+1 我对 QT 一无所知,但将一个大问题分解成较小(更易于管理)的问题的想法绝对是一个很好的原则可以遵循。 - Adrian K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接