SCXML 编辑器

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

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

当您打开一个 .scxml 文件时,它将在 SCXML 编辑器中打开

{SCXML editor}

从小结状态视图(1)拖动状态到状态编辑器(2)。在状态编辑器中选择一个状态,并使用工具按钮(3)创建转换(4)和它的目标状态

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

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

按钮名称描述
保存截图将状态图当前可见部分保存为图片。
导出到图片将整个状态图保存为图片。

放大

缩小

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

您还可以按下 Ctrl 并使用鼠标滚轮。

平移平移状态图。要增加平移速度,请按住 Shift 键。
适合视图使整个状态图在状态编辑器中一次可见。
放大镜工具放大状态图的某部分。要更快地移动放大镜工具,请按住 Alt 键。
导航器在状态编辑器中显示较大状态图的一部分。移动导航器框架到您想要查看的部分。
查看统计信息显示状态图中状态和转换的数量统计。

要在状态图中进行搜索,选择搜索并开始在过滤器字段中键入。搜索会检查SCXML树的整个树结构以匹配搜索条件。

状态

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

状态图是层级的,因此可以在其他状态内部嵌套状态以创建复合状态。

可以创建以下类型的状态

按钮名称描述
初始当状态机启动时进入的状态。
状态基本状态。
并行具有执行并行且同时活跃的子状态。每个子状态独立处理事件,事件可能为每个子状态触发不同的转换。
最终允许状态机完成。当状态机进入顶级最终状态时,它发出完成信号并停止。您可以在复合状态中创建最终状态以隐藏复合状态的内部细节。外部世界只能在外部状态完成时进入该状态并获得通知。当所有子状态达到最终状态时,并行状态完成。
历史一个表示父状态在上次父状态退出时所在子状态的伪状态。

将历史状态创建为要记录当前子状态的状态的子状态。当状态机在运行时检测到此类状态存在时,会自动记录退出父状态时的当前(实际)子状态。转到历史状态的转换实际上是从状态机之前保存的子状态转换。状态机自动将转换转发到实际子状态。

要创建状态之间的转换,选择

添加状态

可以通过以下方式将新状态添加到状态图

  • 通用状态视图中拖动状态到状态编辑器。
  • 在状态编辑器中选择一个状态,然后选择状态工具按钮以创建转换及其目标状态。
  • 在SCXML编辑器内部或之间粘贴状态。

将状态拖到其他状态上以创建复合状态。您还可以将子状态从父状态中拖出。要移动父状态内部的子状态,在拖动时按下Ctrl键。

对齐和编辑状态

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

{Buttons for editing states}

重叠状态用红色标注。

查看状态树结构

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

要在状态编辑器中更详细地查看嵌套状态的孩子状态,选择状态缩放

为确保复合状态机内状态id的唯一性,请选择切换完整命名空间)。父状态名称添加到子状态名称中,以两个冒号(::)分隔。例如

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

管理转换

转换定义了一个状态如何对由状态机或外部实体生成的事件进行响应。当事件发生时,状态机检查活动状态中的匹配转换并移动到目标状态。

要从选定的状态创建新的状态转换,请将鼠标拖动到您想要添加目标状态的位置并释放。当您将转换绘制到另一个状态的中心时,它指向状态的中心,但您也可以绘制到状态的边缘。

编辑器对转换标签进行居中对齐,但您可以拖动它们到其他位置。

转换上的条件出现在方括号“[]”内。

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

要使用鼠标点击添加新的边缘点,选择

要删除选定的转换,请在上下文菜单中选择删除

添加可执行内容

将可执行内容添加到状态图,以使状态机能够更改其数据模型并与外部实体交互。

使用上下文菜单命令将可执行内容添加到<onentry><onexit>元素或转换。

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

在转换期间,状态机执行您为其离开的状态中的<onexit>元素指定的内容,然后是转换中的内容,最后是进入的状态中<onentry>元素的内容。

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

另请参阅创建状态图

©2024 Qt公司有限公司。本文档中的文档贡献是各自所有者的版权。此处提供的文档是根据自由软件基金会公布的GNU自由文档许可证版本1.3的条款许可的。Qt及其相关标志是Qt公司在芬兰和/或世界各地的商标。所有其他商标均为各自所有者的财产。