Auf dieser Seite

SCXML-Ampel (dynamisch, Widgets)

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

Ampel mit leuchtendem Grün

„Traffic Light“ veranschaulicht, wie eine Verbindung zu den aktiven Eigenschaften eines Zustands in einer dynamisch geladenen Zustandsmaschine hergestellt wird.

Die Benutzeroberfläche wird mit „ Qt Widgets “ erstellt.

Ausführen des Beispiels

Sie können das Beispiel wie folgt ausführen:

Dynamisches Laden der Zustandsmaschine

Wir verknüpfen das Modul „ Qt SCXML “, indem wir die folgenden Zeilen zu den Build-Dateien des Beispiels hinzufügen.

Bei Verwendung von qmake in die .pro-Datei:

QT += widgets scxml

Bei Verwendung von cmake in „CMakeLists.txt “:

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 die Zustandsmaschine dynamisch in „trafficlight-widgets-dynamic.cpp“:

#include "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 instanziieren sie anschließend:

    TrafficLight widget(machine);
    widget.show();
    machine->setParent(&widget);
    machine->start();

    return app.exec();
}

Verknüpfung mit Zuständen

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