编辑 SCXML 状态图
状态图是一种通过图形化方式建模系统如何响应刺激的方法。它们定义了系统可能处于的状态,以及系统如何从一个状态转换到另一个状态(状态之间的转换)。 事件驱动型系统(如 Qt 应用程序)的行为通常不仅取决于最近或当前的事件,还取决于之前的事件。借助状态图,您可以轻松共享这些信息。
借助Qt Creator 文件向导,您可以向项目中添加包含模板代码的状态图XML(SCXML)文件。使用SCXML编辑器编辑状态图,向文件中添加状态和转换。然后,使用Qt SCXML 模块中的类,将从这些文件创建的状态机嵌入到Qt应用程序中。
打开 .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 | 一种伪状态,表示父状态上次退出时所处的子状态。 将历史状态作为目标状态的子状态创建,以记录该状态的当前子状态。当状态机在运行时检测到此类状态的存在时,会在父状态退出时自动记录当前(真实)的子状态。 向历史状态的转换实际上是向状态机先前保存的子状态的转换。状态机会自动将该转换转发至真实的子状态。 |
要创建状态之间的转换,请选择“
”。
添加状态
您可以通过以下方式向状态图添加新状态:
- 将状态从“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.












