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
)

状态图指令 STATECHARTSqt6_add_statecharts 启动 Qt SCXML 编译器 qscxmlc,它将自动运行以生成 statemachine.hstatemachine.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);

示例项目 @ code.qt.io

© 2024 Qt 公司有限。本文件中包含的文档贡献者是各自版权的所有者。本文件提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款许可的。Qt 和相应的标识是芬兰以及/或其他国家的 Qt 公司的商标。所有其他商标均为各自所有者的财产。