SCXML 交通信号灯(静态,QML)

一个使用编译状态机实现交通灯的 Qt Quick 应用程序。

交通信号灯演示了如何在将状态机编译为类的情况下连接到状态机中的活动属性。

使用 Qt Quick 创建用户界面。

运行示例

要从 Qt Creator 运行示例,请打开 欢迎 模式并从 示例 中选择示例。有关更多信息,请参阅 构建和运行示例

编译状态机

通过将以下行添加到示例的构建文件中,我们链接到 Qt SCXML 模块。

当使用 qmake 时:
QT += qml scxml

然后,我们指定要编译的状态机

STATECHARTS = ../trafficlight-common/statemachine.scxml
当使用 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,然后将其作为编译的适当头文件和源文件添加。

实例化状态机

我们如下实例化状态机

import TrafficLightApplication

Window {
    width: lights.width
    height: lights.height
    visible: true

    Lights {
        id: lights
        stateMachine: TrafficLightStateMachine {
            running: true
        }

连接到状态

在 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>

我们如下连接到状态

    states: [
        State {
            name: "Red"
            when: lights.stateMachine.red

            PropertyChanges { redLight.opacity: 1 }
        },
        State {
            name: "RedGoingGreen"
            when: lights.stateMachine.redGoingGreen

            PropertyChanges { redLight.opacity: 1 }
            PropertyChanges { yellowLight.opacity: 1 }
        },
        State {
            name: "Yellow"
            when: lights.stateMachine.yellow || lights.stateMachine.blinking

            PropertyChanges { yellowLight.opacity: 1 }
        },
        State {
            name: "Green"
            when: lights.stateMachine.green

            PropertyChanges { greenLight.opacity: 1 }
        }
    ]

示例项目 @ code.qt.io

© 2024 The Qt Company Ltd. 本文档的贡献包括其所有者的版权。本文档依据自由软件基金会发布的 GNU 自由文档许可协议版本 1.3 进行许可。Qt 和相关商标为 The Qt Company Ltd. 在芬兰和/或全球其他国家的商标。所有其他商标均为其所有者的财产。