Auf dieser Seite

SCXML-Ampel (statisch, Widgets)

Eine Widget-basierte Anwendung, die eine kompilierte Zustandsmaschine verwendet, um eine Ampel zu implementieren.

Ampel, bei der das grüne Licht leuchtet

Das Beispiel „Ampel“ (statisch) 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 Widgets “ erstellt.

Ausführen des Beispiels

Sie können das Beispiel wie folgt 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 scxml

Anschließend geben wir die zu kompilierende Zustandsmaschine an:

STATECHARTS = statemachine.scxml
CMakeLists.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 statemachine.h und statemachine.cpp zu generieren, die dann entsprechend als Header- und Quelldateien für die Kompilierung hinzugefügt werden.

Instanziierung der Zustandsmaschine

Wir instanziieren die generierte Klasse „ TrafficLightStateMachine “ in der Datei „trafficlight-widgets-static.cpp“ wie folgt:

#include "statemachine.h"
#include "trafficlight.h"

#include <QtWidgets/qapplication.h>

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    TrafficLightStateMachine machine;
    TrafficLight widget(&machine);
    widget.show();
    machine.start();

    return app.exec();
}

Verknüpfung mit Zuständen

In der SCXML-Datei legen wir für jede Ampel die Zustände „rot“, „gelb“ und „grün“ fest. 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 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>

Wir verbinden die Zustände wie folgt:

    machine->connectToState(u"red"_s, widget->redLight(), &LightWidget::switchLight);
    machine->connectToState(u"redGoingGreen"_s, widget->redLight(), &LightWidget::switchLight);
    machine->connectToState(u"yellow"_s, widget->yellowLight(), &LightWidget::switchLight);
    machine->connectToState(u"blinking"_s, widget->yellowLight(), &LightWidget::switchLight);
    machine->connectToState(u"green"_s, widget->greenLight(), &LightWidget::switchLight);

Beispielprojekt @ code.qt.io

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