SCXML-Ampel (dynamisch, Widgets)
Eine Widget-basierte Anwendung, die einen dynamisch geladenen Zustandsautomaten zur Implementierung einer Ampel verwendet.
Traffic Light demonstriert, wie man eine Verbindung zu den aktiven Eigenschaften eines Zustands in einem dynamisch geladenen 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. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.
Dynamisches Laden des Zustandsautomaten
Wir linken gegen das Modul Qt SCXML, indem wir die folgenden Zeilen zu den Build-Dateien des Beispiels hinzufügen.
Zu .pro bei Verwendung von qmake:
QT += widgets scxml
Zu CMakeLists.txt bei der Verwendung von cmake:
find_package(Qt6 REQUIRED COMPONENTS Core Gui Scxml Widgets) target_link_libraries(trafficlight-widgets-dynamic PRIVATE Qt6::Core Qt6::Gui Qt6::Scxml Qt6::Widgets )
Wir erstellen den Zustandsautomaten dynamisch in trafficlight-widgets-dynamic.cpp:
#include "../trafficlight-common/trafficlight.h" #include <QtWidgets/qapplication.h> #include <QtCore/qiodevice.h> #include <QtCore/qtextstream.h> using namespace Qt::Literals::StringLiterals; int main(int argc, char **argv) { QApplication app(argc, argv); QScxmlStateMachine *machine = QScxmlStateMachine::fromFile(u":statemachine.scxml"_s); if (!machine->parseErrors().isEmpty()) { QTextStream errs(stderr, QIODevice::WriteOnly); const auto errors = machine->parseErrors(); for (const QScxmlError &error : errors) { errs << error.toString(); } return -1; }
Und dann instanziieren wir ihn:
TrafficLight widget(machine); widget.show(); machine->setParent(&widget); 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.