SCXML 交通信号灯(动态,QML)
一个Qt Quick 应用程序,它使用动态加载的状态机来实现交通信号灯。

“交通信号灯 QML”演示了如何连接到动态加载的状态机中某个状态的活动属性。
用户界面使用Qt Quick 创建。
运行示例
您可以通过以下方式运行该示例:
- Qt Creator
打开Welcome 模式,并从Examples 中选择该示例。有关更多信息,请参阅Qt Creator :教程:构建和运行。
- Qt Extension for Visual Studio Code
在Command Palette 中运行Qt: Open Qt examples 命令,并从列表中选择该示例。有关更多信息,请参阅Qt Extension for Visual Studio Code :教程:构建和运行。
动态加载状态机
通过在示例的构建文件中添加以下几行代码,将项目与Qt SCXML 模块进行链接。
使用 qmake 时,在.pro文件中:
QT += qml scxml使用 cmake 时,在CMakeLists.txt中添加:
find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml Scxml)
target_link_libraries(trafficlight-qml-dynamic PRIVATE
Qt6::Core
Qt6::Gui
Qt6::Qml
Qt6::Scxml
)我们在主 QML 文件中动态创建状态机:
import QtScxml
import TrafficLightApplication
Window {
width: lights.width
height: lights.height
visible: true
Lights {
id: lights
stateMachine: loader.stateMachine
// Suppress qmllint warning, dynamic statemachine properties not known at compile-time
// qmllint disable missing-property
button.source: stateMachine.working ? "pause.png" : "play.png"
button.onClicked: stateMachine.submitEvent(stateMachine.working ? "smash" : "repair");
// qmllint enable missing-property
}
StateMachineLoader {
id: loader
source: Qt.resolvedUrl("statemachine.scxml")
}
}连接到状态
在 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: [
// Suppress qmllint warning, dynamic statemachine properties not known at compile-time
// qmllint disable missing-property
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 }
}
// qmllint enable missing-property
]© 2026 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.