SCXML交通灯(动态,QML)
一个使用动态加载的状态机实现交通灯的Qt Quick应用程序。
交通灯QML演示了如何连接到动态加载状态机的状态的活动属性。
UI是使用Qt Quick创建的。
运行示例
要从Qt Creator运行示例,请打开欢迎模式,并从示例中选取示例。有关更多信息,请访问构建和运行示例。
动态加载状态机
我们通过将以下行添加到示例的构建文件中来链接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 ]
© 2024 Qt公司。此处包含的文档贡献的版权归各自的拥有者。本文档提供的文档根据GNU自由文档许可版本1.3的条款发布,该许可由自由软件基金会发布。Qt及其相关的标志是芬兰以及/或其他国家Qt公司的注册商标。所有其他商标都是其所有者的财产。