Mac NTFS读写终极方案:Nigate开源工具完整指南与深度技术分析
2026/6/7 13:48:18
<scxmlxmlns="http://www.w3.org/2005/07/scxml"version="1.0"initial="MainControl"><!-- 主控制状态 --><stateid="MainControl"><initial><transitiontarget="Stopped"/></initial><!-- 设备停止状态 --><stateid="Stopped"><onentry><logexpr="'设备已停止'"/></onentry><transitionevent="start"target="Running"/></state><!-- 设备运行状态 --><stateid="Running"initial="Preparing"><onentry><logexpr="'设备启动中...'"/></onentry><!-- 准备阶段 --><stateid="Preparing"><transitionevent="ready"target="Working"/></state><!-- 工作阶段 --><stateid="Working"><transitionevent="emergency.stop"target="Stopped"/><transitionevent="pause"target="Paused"/></state><!-- 暂停状态 --><stateid="Paused"><transitionevent="resume"target="Working"/><transitionevent="emergency.stop"target="Stopped"/></state></state></state><!-- 并行电池监控状态 --><parallelid="BatteryMonitor"><stateid="Normal"><transitioncond="BatteryLevel<20"target="LowBattery"/></state><stateid="LowBattery"><onentry><logexpr="'警告:电量不足!'"/></onentry><transitioncond="BatteryLevel>= 20"target="Normal"/></state></parallel><!-- 全局事件处理 --><transitionevent="system.shutdown"target="Shutdown"/><finalid="Shutdown"><onentry><logexpr="'系统关闭'"/></onentry></final></scxml>
单击状态会出现箭头
绘制完成
查看结果:
<?xml version="1.0" encoding="UTF-8"?><scxmlxmlns="http://www.w3.org/2005/07/scxml"version="1.0"binding="early"xmlns:qt="http://www.qt.io/2015/02/scxml-ext"name="MainControl"qt:editorversion="18.0.0"initial="Stopped"><qt:editorinfoinitialGeometry="221.80;107.85;-20;-20;40;40"/><stateid="Stopped"><qt:editorinfoscenegeometry="535.18;129.21;475.18;79.21;120;100"geometry="535.18;129.21;-60;-50;120;100"/><transitiontype="external"event="start"target="Running"/></state><stateid="Running"><qt:editorinfoscenegeometry="419.70;326.60;-174.47;359.95;1419.29;255.59"geometry="419.70;326.60;-594.16;33.35;1419.29;255.59"/><stateid="Preparing"><qt:editorinfoscenegeometry="383.59;291.38;323.59;241.38;120;100"geometry="-490.41;161.15;-60;-50;120;100"/><transitiontype="external"event="ready"target="Working"/></state><stateid="Working"><qt:editorinfoscenegeometry="471.49;487.75;411.49;437.75;120;100"geometry="51.79;161.15;-60;-50;120;100"/><transitiontype="external"event="pause"target="Paused"/></state><stateid="Paused"><qt:editorinfoscenegeometry="1616.74;291.38;1556.74;241.38;120;100"geometry="742.74;161.15;-60;-50;120;100"/><transitiontype="external"event="resume"target="Working"/></state></state></scxml>其余自己添加
参考我这篇文档:Qt SCXML 模块详解
SCXML (State Chart XML) 是一种基于 XML 的 W3C 标准,用于描述复杂的状态机(State Machines)。它提供了一种形式化的方式来定义:
初始状态、最终状态、复合状态(包含子状态)、并行状态。事件触发,并可带有条件和执行的动作。Qt 的 SCXML 模块 (QtSCXML) 提供了在 Qt 应用程序中使用 SCXML 标准的能力。其主要组件包括:
qscxmlc):一个命令行工具(或可通过 CMake/QMake 集成),用于将 SCXML 文件编译成 C++ 代码(.h和.cpp文件)。QScxmlStateMachine的特定状态机类。该类:submitEventName()代替通用的submitEvent("EventName"))。property()或生成的 getter/setter)。QScxmlStateMachine可以无缝地与 Qt 的事件循环和对象系统协作。使用文本编辑器或专门的 SCXML 编辑器(如qscxml提供的qscxmlmon)创建描述状态机的.scxml文件。例如,一个简单的开关状态机:
<scxmlxmlns="http://www.w3.org/2005/07/scxml"version="1.0"initial="off"><stateid="off"><transitionevent="switch"target="on"/></state><stateid="on"><transitionevent="switch"target="off"/></state></scxml>qscxmlc编译 SCXML 文件qscxmlc -o LightSwitchMachine.h LightSwitchMachine.scxmlfind_package(Qt6 COMPONENTS SCXML REQUIRED) qt_add_scxml_file(LightSwitchMachine "LightSwitchMachine.scxml" OUTPUT_HEADER LightSwitchMachine.h OUTPUT_SOURCE LightSwitchMachine.cpp)scxml_files = LightSwitchMachine.scxml qscxmlc.commands = qscxmlc -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN} QMAKE_EXTRA_COMPILERS += scxmlc.pro,CMakeLists.txt)包含scxml模块。QT += scxmlfind_package(Qt6 COMPONENTS SCXML REQUIRED)和target_link_libraries(myapp Qt6::SCXML)qscxmlc,包含生成的头文件#include "LightSwitchMachine.h";否则使用#include <QtScxml/QScxmlStateMachine>。QScxmlStateMachine*machine=QScxmlStateMachine::fromFile(":/LightSwitchMachine.scxml");LightSwitchMachine*machine=newLightSwitchMachine();machine->start();// 未编译 (通用方法)machine->submitEvent("switch");// 已编译 (类型安全方法)machine->submitSwitch();// 假设事件名为 'switch'QString currentState=machine->activeStateNames().first();// 获取根状态下的活动状态名// 已编译 (使用枚举)if(machine->isActive(LightSwitchMachine::On)){...}// 状态进入/退出信号connect(machine,&QScxmlStateMachine::reachedStableState,this,&MyClass::onStableState);connect(machine,&QScxmlStateMachine::stateEntered,this,&MyClass::onStateEntered);connect(machine,&QScxmlStateMachine::stateExited,this,&MyClass::onStateExited);// 已编译状态机可能有更具体的信号#include"LightSwitchMachine.h"// 由 qscxmlc 生成#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){QCoreApplicationapp(argc,argv);LightSwitchMachine machine;machine.start();// 启动状态机,初始状态为 "off"// 连接信号查看状态变化QObject::connect(&machine,&LightSwitchMachine::onEntered,[](constQString&state){qDebug()<<"Entered state:"<<state;});// 发送事件切换状态machine.submitSwitch();// 从 off -> onmachine.submitSwitch();// 从 on -> offreturnapp.exec();}Qt 的 SCXML 模块为在 Qt 应用程序中实现基于标准的、复杂的、可维护的状态机行为提供了强大的支持。通过编写 SCXML 文件定义状态逻辑,利用QScxmlStateMachine运行,并可选地使用qscxmlc编译器提升性能和类型安全,开发者能够高效地管理应用的状态流转。