Instanziierung von Zustandsmaschinen
Sowohl die dynamisch erstellten als auch die kompilierten Zustandsmaschinen verhalten sich auf dieselbe Weise, verfügen über dieselben Eigenschaften, Zustände, dasselbe Datenmodell usw. Sie unterscheiden sich lediglich in der Art und Weise, wie sie instanziiert werden. Um eine Zustandsmaschine in C++ dynamisch aus einer SCXML-Datei zu erstellen, können Sie Folgendes verwenden:
auto *stateMachine = QScxmlStateMachine::fromFile("MyStatemachine.scxml");Oder in QML:
import QtScxml
Item {
property StateMachine stateMachine: scxmlLoader.stateMachine
StateMachineLoader {
id: scxmlLoader
source: "statemachine.scxml"
}
}Eine kompilierte Zustandsmaschine kann genauso wie jedes andere C++-Objekt instanziiert werden:
auto *stateMachine = new MyStatemachine;Oder:
MyStatemachine stateMachine;Um eine kompilierte Zustandsmaschine in QML zu verwenden, können Sie diese als QML-Typ registrieren:
struct MyStateMachineRegistration {
Q_GADGET
QML_NAMED_ELEMENT(MyStateMachine)
QML_FOREIGN(MyStateMachine)
QML_ADDED_IN_VERSION(1, 0)
};Anschließend können Sie sie in QML wie folgt instanziieren:
import MyStateMachine 1.0
MyStateMachine {
id: stateMachine
}Um eine Zustandsmaschine zu kompilieren, müssen die folgenden Zeilen zur Build-Datei des Projekts hinzugefügt werden:
Bei Verwendung von CMake:
find_package(Qt6 REQUIRED COMPONENTS Scxml)
target_link_libraries(mytarget PRIVATE Qt6::Scxml)qt_add_statecharts(mytarget
MyStatemachine.scxml
)Bei Verwendung von qmake:
QT += scxmlSTATECHARTS = MyStatemachine.scxmlDadurch wird qmake angewiesen, qscxmlc auszuführen, wodurch MyStatemachine.h und MyStatemachine.cpp generiert und entsprechend zu den Header- und Quelldateien des Projekts hinzugefügt werden. Standardmäßig werden die generierten Dateien im Build-Verzeichnis gespeichert. Die qmake-Variable ` QSCXMLC_DIR` oder die cmake-Variable `OUTPUT_DIRECTORY` kann gesetzt werden, um ein anderes Verzeichnis anzugeben. Die qmake-Variable ` QSCXMLC_NAMESPACE ` oder die cmake-Variable `NAMESPACE` kann gesetzt werden, um den Code der Zustandsmaschine in einen C++-Namespace einzubinden.
Nach der Instanziierung einer Zustandsmaschine können Sie wie folgt eine Verbindung zur „active“-Eigenschaft eines beliebigen Zustands herstellen. Wenn die Zustandsmaschine für eine Ampel beispielsweise einen Zustand hat, der angibt, dass die Ampel rot ist (der in der scxml-Datei die praktische ID „red“ hat), können Sie Folgendes schreiben:
stateMachine->connectToState("red", [](bool active) {
qDebug() << (active ? "entered" : "exited") << "the red state";
});Und in QML:
Light {
id: greenLight
color: "green"
visible: stateMachine.green
}Wenn Sie benachrichtigt werden möchten, wenn eine Zustandsmaschine ein Ereignis auslöst, können Sie eine Verbindung zum entsprechenden Signal herstellen. Für eine Medienplayer-Zustandsmaschine, die durch das Senden eines Ereignisses anzeigt, dass die Wiedergabe gestoppt wurde, können Sie beispielsweise Folgendes schreiben:
stateMachine->connectToEvent("playbackStopped", [](const QScxmlEvent&){
qDebug() << "Stopped!";
});Und in QML:
import QtScxml
EventConnection {
stateMachine: stateMachine
events: ["playbackStopped"]
onOccurred: console.log("Stopped!")
}Das Senden von Ereignissen an eine Zustandsmaschine ist ebenso einfach:
stateMachine->submitEvent("tap", QVariantMap({
{ "artist", "Fatboy Slim" },
{ "title", "The Rockafeller Skank" }
}));Dadurch wird ein „tap“-Ereignis generiert, wobei der Inhalt der Karte in _event.data innerhalb der Zustandsmaschine verfügbar ist. In QML:
stateMachine.submitEvent("tap", {
"artist": "Fatboy Slim"
"title": "The Rockafeller Skank"
})Hinweis: Eine Zustandsmaschine benötigt eine „ QEventLoop “, um korrekt zu funktionieren. Die Ereignisschleife wird verwendet, um das Attribut „ delay “ für Ereignisse zu implementieren und die Verarbeitung einer Zustandsmaschine zu planen, wenn Ereignisse von verschachtelten (oder übergeordneten) Zustandsmaschinen empfangen werden. Bei einer QML-Anwendung oder einer Widget-Anwendung läuft immer eine Ereignisschleife, sodass keine zusätzlichen Maßnahmen erforderlich sind. Bei anderen Anwendungen muss ` QApplication::run ` aufgerufen werden, um die Verarbeitung der Ereignisschleife zu starten.
© 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.