SCXML 交通灯(动态,小部件)
这是一个基于 Widget 的应用程序,它使用动态加载的状态机来实现交通灯。
交通灯演示了如何在动态加载的状态机中连接状态的活动属性。
用户界面使用Qt Widgets 创建。
运行示例
运行示例 Qt Creator,打开Welcome 模式,并从Examples 中选择示例。更多信息,请参见Qt Creator: Tutorial:构建并运行。
动态加载状态机
我们通过在示例的构建文件中添加以下几行来链接Qt SCXML 模块。
使用 qmake 时添加到.pro中:
QT += widgets scxml
使用 cmake 时添加到CMakeLists.txt:
find_package(Qt6 REQUIRED COMPONENTS Core Gui Scxml Widgets) target_link_libraries(trafficlight-widgets-dynamic PRIVATE Qt6::Core Qt6::Gui Qt6::Scxml Qt6::Widgets )
我们在trafficlight-widgets-dynamic.cpp 中动态创建状态机:
#include "../trafficlight-common/trafficlight.h" #include <QtWidgets/qapplication.h> #include <QtCore/qiodevice.h> #include <QtCore/qtextstream.h> using namespace Qt::Literals::StringLiterals; int main(int argc, char **argv) { QApplication app(argc, argv); QScxmlStateMachine *machine = QScxmlStateMachine::fromFile(u":statemachine.scxml"_s); if (!machine->parseErrors().isEmpty()) { QTextStream errs(stderr, QIODevice::WriteOnly); const auto errors = machine->parseErrors(); for (const QScxmlError &error : errors) { errs << error.toString(); } return -1; }
然后将其实例化:
TrafficLight widget(machine); widget.show(); machine->setParent(&widget); 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);
© 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.