SCXML-Ampel (Einfach, QML)

Eine Qt Quick Anwendung, die einen kompilierten Zustandsautomaten verwendet, um eine vereinfachte Ampel zu implementieren.

Traffic Light demonstriert, wie man eine Verbindung zu den aktiven Eigenschaften eines Zustands in einem Zustandsautomaten herstellt, der zu einer Klasse kompiliert wurde.

Die Benutzeroberfläche wurde mit Qt Quick erstellt.

Ausführen des Beispiels

Zum Ausführen des Beispiels von Qt Creatorzu starten, öffnen Sie den Modus Welcome und wählen Sie das Beispiel aus Examples. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.

Kompilieren des Zustandsautomaten

Wir linken gegen das Modul Qt SCXML, indem wir die folgenden Zeilen zu den Build-Dateien des Beispiels hinzufügen.

.pro bei Verwendung von qmake:
QT += qml scxml

Anschließend geben wir den zu kompilierenden Zustandsautomaten an:

STATECHARTS = ../trafficlight-common/statemachine.scxml
CMakeLists.txt bei der Verwendung von 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
)

Wir geben dann den zu kompilierenden Zustandsautomaten an:

qt6_add_statecharts(trafficlight-qml-static
    ../trafficlight-common/statemachine.scxml
)

Die Statechart-Direktiven STATECHARTS oder qt6_add_statecharts rufen den Qt SCXML Compiler, qscxmlc, auf, der automatisch ausgeführt wird, um statemachine.h und statemachine.cpp zu erzeugen, die dann entsprechend als Header und Quellen für die Kompilierung hinzugefügt werden.

Instanziierung des Zustandsautomaten

Wir instanziieren den Zustandsautomaten wie folgt:

    TrafficLightStateMachine {
        id: stateMachine
        running: true
    }

Verbinden mit Zuständen

In der SCXML-Datei geben wir die Zustände für jede Ampel an: 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> geben wir das Ereignis an, das den Übergang in den 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>

Die Verbindung zu den Zuständen wird wie folgt hergestellt:

        Light {
            anchors.top: parent.top
            anchors.horizontalCenter: parent.horizontalCenter
            color: "red"
            visible: stateMachine.red || stateMachine.redGoingGreen
        }

        Light {
            anchors.centerIn: parent
            color: "yellow"
            visible: stateMachine.yellow || stateMachine.blinking
        }

        Light {
            anchors.bottom: parent.bottom
            anchors.horizontalCenter: parent.horizontalCenter
            color: "green"
            visible: stateMachine.green
        }
    }

Beispielprojekt @ code.qt.io

© 2025 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.