使用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) 或 (cmake) 指定输出文件的目录。OUTPUT_DIR (cmake) 已被弃用。OUTPUT_DIRECTORY |
QSCXMLC_NAMESPACE|NAMESPACE <namespace> | QSCXMLC_NAMESPACE (qmake) 或 (cmake) 指定生成类的命名空间。NAMESPACE |
QSCXMLC_ARGUMENTS|OPTIONS <options> | QSCXMLC_ARGUMENTS (qmake) 或 (cmake) 允许为 编译器指定附加选项。使用 cmake 的 QSCXMLC_ARGUMENTS 已被弃用。OPTIONS qscxmlc |
© 2025 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.