SCXML 编辑器

状态图是对系统如何对刺激做出反应进行建模的一种图形方式。它们定义了系统可能处于的状态,以及系统如何从一种状态移动到另一种状态状态之间的转换)。事件驱动系统(如 Qt 应用程序)的行为往往不仅取决于最后或当前的事件,还取决于先前的事件。通过状态图,您可以轻松共享这些信息。

使用Qt Creator 文件向导,您可以将带有模板代码的状态图 XML(SCXML)文件添加到项目中。使用 SCXML 编辑器编辑状态图,将状态和转换添加到文件中。然后,使用Qt SCXML 模块中的类将从文件创建的状态机嵌入 Qt XML 应用程序中。

打开 .scxml 文件时,它将在 SCXML 编辑器中打开:

SCXML 编辑器

将状态从Common States 视图 (1) 拖到状态编辑器 (2)。在状态编辑器中选择一个状态,然后使用工具按钮 (3) 创建过渡 (4) 及其目标状态

Structure 视图 (5) 中查看状态图结构,并在Attributes 视图 (6) 中指定所选状态或过渡的属性。

使用工具栏按钮执行编辑、缩放、放大、导航和平移状态图等功能,以及截图和查看统计信息。

按钮按钮名称说明
保存屏幕截图Save Screenshot将状态图的当前可见部分保存为图像。
将画布导出为图像Export Canvas to Image将整个状态图保存为图像。
放大

放大

Zoom In

Zoom Out

在状态编辑器中放大或缩小整个状态图。

也可以选择Ctrl 键并使用鼠标滚轮。

平移Panning平移状态图。要加快平移速度,请选择Shift
适合查看Fit to View在状态编辑器中一次显示整个状态图。
放大镜工具Magnifier Tool放大状态图的一部分。要更快地移动放大镜工具,请选择并按住Alt
导航仪Navigator在状态编辑器中显示大型状态图的特定部分。在要查看的部分移动导航框。
查看统计数据View Statistics显示状态图中状态和转换数量的统计数据。

要在状态图中搜索,请选择Search ,然后在Filter 字段中开始输入。搜索会检查整个 SCXML 树,查找符合搜索条件的属性。

状态

当状态机响应事件进入一个状态时,进入的状态就成为活动状态

状态图是分层的,因此可以将状态嵌套到其他状态中,创建复合状态。

您可以创建以下类型的状态:

按钮名称按钮名称
初始状态Initial状态机启动时进入的状态。
基本状态State基本状态。
平行状态Parallel具有并行执行且同时激活的子状态。每个子状态都独立处理事件,事件可能会触发每个子状态的不同转换。
最终状态Final让状态机结束。当状态机进入顶层终态时,它会发出完成信号并停止。你可以在复合状态中创建终态,以隐藏复合状态的内部细节。外界只能进入该状态,并在状态结束时收到通知。当并行状态的所有子状态都达到最终状态时,并行状态就结束了。
历史History伪状态(pseudo-state):代表父状态最后一次退出时的子状态。

创建一个历史状态,作为要记录当前子状态的状态的子状态。当状态机在运行时检测到有这样一个状态时,它会在父状态退出时自动记录当前(真实)的子状态。向历史状态的转换实际上就是向状态机先前保存的子状态的转换。状态机会自动将过渡转发到真实子状态。

要创建状态间的转换,请选择过渡

添加状态

可以通过以下方式在状态图中添加新状态:

  • Common States 视图拖动状态到状态编辑器。
  • 在状态编辑器中选择一个状态,然后选择State 工具按钮来创建过渡及其目标状态。
  • 在 SCXML 编辑器内或 SCXML 编辑器与Edit 模式之间复制和粘贴状态。

将状态拖到其他状态之上,创建复合状态。也可以将子状态从父状态拖出。要在父状态中移动子状态,请在拖动时选择并按住Ctrl 键

对齐和编辑状态

使用工具栏按钮对齐状态编辑器中的状态,调整其大小、颜色和字体,以及更改默认配色方案。

用于编辑状态的按钮

重叠的状态用红色标记。

查看状态树结构

要在Structure 视图中展开或折叠状态树结构,请双击一个状态。

要在状态编辑器中更详细地查看嵌套状态的子状态,请选择Zoom to State

要确保复合状态机中的状态 ID 是唯一的,请选择切换全命名空间 (Toggle Full Namespace)。父状态的名称会添加到子状态的名称中,并用两个冒号(::)分隔。例如

<state id="broken">
...
    <state id="broken::blinking">
    ...
    </state>
    <state id="broken::unblinking">
    ...
    </state>
</state>

管理过渡

过渡定义了一个状态如何对状态机或外部实体产生的事件做出反应。当事件发生时,状态机会检查活动状态中是否有匹配的过渡,并移动到目标状态。

要创建从选定状态到新状态的过渡,可在要添加目标状态的位置拖动并释放鼠标。当你在另一个状态的中心绘制过渡时,过渡会指向状态的中心,但你也可以在状态的边缘绘制过渡。

编辑器会将过渡标签居中对齐,但你也可以将它们拖到其他位置。

过渡条件显示在方括号([])内的过渡线下方。

要为过渡添加边缘点,请选择一条过渡线。每条线只能添加两个边缘点。编辑器会自动删除不必要的边缘点。要删除选定的边缘点,请在上下文菜单中选择Remove Point

要通过鼠标点击添加新的边缘点,请选择过渡

要移除选定的过渡,请在右键菜单中选择Remove

添加可执行内容

在状态图中添加可执行内容可使状态机更改其数据模型并与外部实体交互。

使用上下文菜单命令将可执行内容添加到<onentry><onexit> 元素或过渡中:

  • <raise> 引发事件
  • <send> 与外部实体通信
  • <script> 运行脚本
  • <assign> 更改数据模型
  • <cancel> 取消操作执行
  • <log> 在日志中记录信息
  • <if> 有条件地执行操作
  • <foreach> 遍历集合中的项目,并对每个项目执行操作

在转换过程中,状态机先执行你为<onexit> 元素指定的要离开状态的内容,然后执行转换中的内容,最后执行<onentry> 元素要进入的状态的内容。

您可以在Attributes 视图中为选定的可执行内容添加属性。

另请参阅 创建状态图

Copyright © The Qt Company Ltd. and other contributors. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.