本页内容

Qt SCXML 概述

Qt SCXML 模块提供了一系列类,用于将基于状态图XML(SCXML)文件创建的状态机嵌入到Qt应用程序中。SCXML文件可以使用任何合适的工具(例如文本编辑器或仿真器)创建,只要它们符合SCXML规范,并遵守“SCXML合规性”中描述的限制和扩展即可。

应用程序逻辑的某些部分可以替换为封装好的SCXML文件。这使得通过使用Qt Quick 或Qt Widgets ,能够将应用程序逻辑与用户界面实现清晰地分离。

Qt SCXML 模块与State Machine 框架的区别在于 Qt State Machine 模块的区别在于:Qt SCXML 提供了一个符合规范的处理器,能够解析和处理符合规范的 SCXML 文档。在Qt SCXML 中,状态机从独立的 SCXML 文件中读取,并通过实例化QScxmlStateMachine 类并动态加载 SCXML 文件,或者使用Qt SCXML 编译器生成QScxmlStateMachine 的子类并对其进行实例化,从而将其集成到 Qt 应用程序中。 与 SCXML 文档的通信由QScxmlStateMachine 类的信号和方法提供。

状态机中的基本概念——状态、转换和 事件——基于 SCXML 规范中的定义。 状态图提供了一种图形化方式来建模系统如何对刺激作出反应。这是通过定义系统可能处于的状态,以及系统如何从一个状态转移到另一个状态(状态之间的转换)来实现的。 事件驱动系统(如 Qt 应用程序)的一个关键特征是,其行为往往不仅取决于最后一个或当前的事件,还取决于其之前的事件。借助状态图,可以轻松表达这些信息。

Qt SCXML 该库与 Qt 的元对象系统紧密集成;例如,状态之间的转换可由信号触发,并且可以配置状态以设置QObjects 上的属性并调用其方法。Qt 的事件系统用于驱动状态机。

Qt SCXML 中的状态图是分层的。状态可以嵌套在其他状态之中,而状态机的当前配置由当前处于活动状态的一组状态组成。

数据模型

Qt SCXML 支持“空”数据模型(符合规范的 SCXML 处理器必须支持该模型)以及 ECMAScript 数据模型。此外,Qt SCXML 还提供了由QScxmlCppDataModel 类实现的专有 C++ 数据模型。 该类支持编写用于expr属性和<script> 元素的 C++ 代码。数据模型的数据部分由QScxmlCppDataModel 的一个子类提供支持,Qt SCXML 编译器将为此生成分派方法。

Qt SCXML 编译器

Qt SCXML 编译器(qscxmlc )会读取.scxml文件,并生成包含C++源文件和头文件的输出,其中包含一个实现SCXML中定义的状态机的类。有关使用该编译器的更多信息,请参阅《使用Qt SCXML 编译器(qscxmlc)》。

无论是动态创建的还是编译生成的状态机,其行为方式、属性、状态、数据模型等均完全一致。它们唯一的区别仅在于实例化的方式。有关详细信息,请参阅《实例化状态机》和《Qt SCXML 示例》。

日志类别

Qt SCXML 模块导出了以下日志类别:

日志类别描述
qscxmlLog启用Qt SCXML 模块日志
scxmlLog启用 SCXML 文档日志

© 2026 The Qt Company Ltd. 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.