SCXML 交通灯(静态、小部件)
一个基于小部件的应用程序,使用编译的状态机来实现交通灯。
交通灯示例(静态)演示了如何连接到编译成类的状态机的活动的状态属性。
用户界面使用 Qt Widgets 创建。
运行示例
要从 Qt Creator 运行示例,请打开 欢迎 模式并从 示例 中选择示例。有关更多信息,请访问 构建和运行示例。
编译状态机
通过将以下行添加到示例的构建文件中,我们将 Qt SCXML 模块链接起来。
.pro 当使用 qmake 时:
QT += qml scxml
然后我们指定要编译的状态机
STATECHARTS = ../trafficlight-common/statemachine.scxml
CMakeLists.txt 当使用 cmake 时:
find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml Scxml) target_link_libraries(trafficlight-qml-static PRIVATE Qt6::Core Qt6::Gui Qt6::Qml Qt6::Scxml )
然后我们指定要编译的状态机
qt6_add_statecharts(trafficlight-qml-static ../trafficlight-common/statemachine.scxml )
状态图指令 STATECHARTS 或 qt6_add_statecharts 启动 Qt SCXML 编译器 qscxmlc
,它将自动运行以生成 statemachine.h 和 statemachine.cpp,然后将它们适当地添加为编译的头部和源文件。
实例化状态机
我们在 trafficlight-widgets-static.cpp 文件中实例化生成的 TrafficLightStateMachine
类,如下所示
#include "statemachine.h" #include "../trafficlight-common/trafficlight.h" #include <QtWidgets/qapplication.h> int main(int argc, char **argv) { QApplication app(argc, argv); TrafficLightStateMachine machine; TrafficLight widget(&machine); widget.show(); machine.start(); return app.exec(); }
连接到状态
在 SCXML 文件中,我们为每个灯指定状态:红色、黄色和绿色。在 <onentry>
元素中,我们指定进入状态时要发送的事件以及发送事件前要延迟的秒数。在 <transition>
元素中,我们指定由 target
属性指定的引发状态转换的事件
<state id="red"> <onentry> <send event="startGoingGreen" delay="3s"/> </onentry> <transition event="startGoingGreen" target="redGoingGreen"/> </state> <state id="yellow" initial="greenGoingRed"> <state id="redGoingGreen"> <onentry> <send event="goGreen" delay="1s"/> </onentry> <transition event="goGreen" target="green"/> </state> <state id="greenGoingRed"> <onentry> <send event="goRed" delay="1s"/> </onentry> <transition event="goRed" target="red"/> </state> </state> <state id="green"> <onentry> <send event="startGoingRed" delay="3s"/> </onentry> <transition event="startGoingRed" target="greenGoingRed"/> </state>
我们按照以下方式连接到状态
machine->connectToState(u"red"_s, widget->redLight(), &LightWidget::switchLight); machine->connectToState(u"redGoingGreen"_s, widget->redLight(), &LightWidget::switchLight); machine->connectToState(u"yellow"_s, widget->yellowLight(), &LightWidget::switchLight); machine->connectToState(u"blinking"_s, widget->yellowLight(), &LightWidget::switchLight); machine->connectToState(u"green"_s, widget->greenLight(), &LightWidget::switchLight);
© 2024 Qt 公司有限。本文件中包含的文档贡献者是各自版权的所有者。本文件提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款许可的。Qt 和相应的标识是芬兰以及/或其他国家的 Qt 公司的商标。所有其他商标均为各自所有者的财产。