本页内容

使用Qt SCXML 编译器(qscxmlc)

qscxmlc 工具会读取 .scxml 文件,并生成 C++ 源文件和头文件,其中包含一个类,该类实现了 SCXML 中定义的状态机。

用法

如果项目文件中将项目链接到了scxml 库,并且通过特殊构建指令STATECHARTS 或qt_add_statecharts指定了要使用的.scxml 文件,则会自动调用qscxmlc 工具。

使用 cmake 时:

find_package(Qt6 REQUIRED COMPONENTS Scxml)
target_link_libraries(mytarget PRIVATE Qt6::Scxml)
qt_add_statecharts(mytarget
    MyStatemachine.scxml
)

使用 qmake 时:

QT += scxml
STATECHARTS = MyStatemachine.scxml

基于上述定义,运行qmake 或cmake 会调用qscxmlc 生成 MyStatemachine.h 和 MyStatemachine.cpp,并将其作为头文件和源文件恰当地添加到项目中。

默认情况下,生成的实现状态机的类名称与<scxml> 根元素的name属性相对应。

qscxmlc 工具也可以手动调用,生成的头文件和源文件可作为项目中的常规源文件使用。当将这些源文件用作cmake 项目的一部分时,必须在CMakeLists.txt文件中额外禁用自动moc功能,如下例所示:

set_source_files_properties(statemachine.h PROPERTIES SKIP_AUTOMOC TRUE)

若省略此步骤,编译时将出现符号重复错误。

命令行选项

qscxmlc 工具支持以下命令行选项:

选项描述
--namespace <namespace>将生成的类放置在指定的命名空间中。
-o <base/out/name>输出文件的基名。该名称可以包含路径。如果未指定,则使用输入文件的基名。
--header <header/out>输出头文件的名称。若未指定,则在基名后添加 .h。
--impl <cpp/out>输出头文件的名称。如果未指定,则在基名后添加 .cpp。
--classname <StateMachineClassName>生成的状态机的类名。若未指定,则采用 <scxml> 标签中 name 属性的值。若该属性也未指定,则从输入文件名中提取基名(不包含路径)。
--statemethods为状态生成额外的访问器和信号方法。这样,您就可以使用普通的 `QObject::connect()` 连接到状态变化,并直接调用方法来判断某个状态当前是否处于活动状态。

qmake 和CMake 项目文件支持以下选项:

选项描述
QSCXMLC_DIR|OUTPUT_DIRECTORY <directory>QSCXMLC_DIR (qmake) 或OUTPUT_DIRECTORY (cmake) 指定输出文件的目录。OUTPUT_DIR (cmake) 已被废弃。
QSCXMLC_NAMESPACE|NAMESPACE <namespace>QSCXMLC_NAMESPACE (qmake) 或NAMESPACE (cmake) 指定生成的类的命名空间。
QSCXMLC_ARGUMENTS|OPTIONS <options>QSCXMLC_ARGUMENTS (qmake) 或OPTIONS (cmake) 允许为qscxmlc 编译器指定附加选项。cmake 中的 QSCXMLC_ARGUMENTS 已被弃用。

© 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.