SCXML-Ampel (statisch, QML)
Eine „ Qt Quick “-Anwendung, die eine kompilierte Zustandsmaschine zur Implementierung einer Ampel verwendet.

„Traffic Light“ veranschaulicht, wie eine Verbindung zu den aktiven Eigenschaften eines Zustands in einer Zustandsmaschine hergestellt wird, die zu einer Klasse kompiliert wurde.
Die Benutzeroberfläche wird mit Qt Quick erstellt.
Ausführen des Beispiels
Sie können das Beispiel wie folgt ausführen:
- Qt Creator
Öffnen Sie den „ Welcome “-Modus und wählen Sie das Beispiel unter „ Examples “ aus. Weitere Informationen finden Sie unter „Qt Creator “: Tutorial: Erstellen und Ausführen.
- Qt Extension for Visual Studio Code
Führen Sie den Befehl „ Qt: Open Qt examples “ über „ Command Palette “ aus und wählen Sie das Beispiel aus der Liste aus. Weitere Informationen finden Sie unter Qt Extension for Visual Studio Code: Tutorial: Erstellen und Ausführen.
Kompilieren der Zustandsmaschine
Wir verknüpfen das Modul „ Qt SCXML “, indem wir die folgenden Zeilen zu den Build-Dateien des Beispiels hinzufügen.
.pro bei Verwendung von qmake:
QT += qml scxmlAnschließend geben wir die zu kompilierende Zustandsmaschine an:
STATECHARTS = statemachine.scxmlCMakeLists.txt bei Verwendung von cmake:
find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml Scxml)
target_link_libraries(trafficlight-qml-simple PRIVATE
Qt::Core
Qt::Gui
Qt::Qml
Qt::Scxml
)Anschließend geben wir die zu kompilierende Zustandsmaschine an:
qt6_add_statecharts(trafficlight-qml-simple
statemachine.scxml
)Die Statechart-Direktiven STATECHARTS oder qt6_add_statecharts rufen den „ Qt SCXML Compiler“ auf ( qscxmlc), der automatisch ausgeführt wird, um die Dateien „statemachine.h“ und „statemachine.cpp“ zu generieren, die anschließend entsprechend als Header- und Quelldateien für die Kompilierung hinzugefügt werden.
Instanziierung der Zustandsmaschine
Wir instanziieren die Zustandsmaschine wie folgt:
import TrafficLightApplication
Window {
width: lights.width
height: lights.height
visible: true
Lights {
id: lights
stateMachine: TrafficLightStateMachine {
running: true
}Verbindung zu den Zuständen
In der SCXML-Datei legen wir für jede Ampel Zustände fest: rot, gelb und grün. Im Element „ <onentry> “ geben wir das Ereignis an, das beim Eintritt in den Zustand gesendet werden soll, sowie die Verzögerung in Sekunden vor dem Senden des Ereignisses. Im Element „ <transition> “ legen wir das Ereignis fest, das den Übergang zu dem durch das Attribut „ target “ angegebenen Zustand auslöst:
<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>Wir verbinden die Zustände wie folgt:
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 }
}
]© 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.