SCXML-Ampel (statisch, Widgets)
Eine Widget-basierte Anwendung, die einen kompilierten Zustandsautomaten zur Implementierung einer Ampel verwendet.
Ampel-Beispiel (statisch) demonstriert, wie man eine Verbindung zu den aktiven Eigenschaften eines Zustands in einem zu einer Klasse kompilierten Zustandsautomaten herstellt.
Die Benutzeroberfläche wird mit Qt Widgets erstellt.
Ausführen des Beispiels
Zum Ausführen des Beispiels von Qt Creatorauszuführen, öffnen Sie den Modus Welcome und wählen Sie das Beispiel aus Examples aus. 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 die generierte Klasse TrafficLightStateMachine
in der Datei trafficlight-widgets-static.cpp wie folgt:
#include "statemachine.h" #include "../trafficlight-common/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(); }
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:
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);
© 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.