QStateMachine Class
Die Klasse QStateMachine bietet einen hierarchischen endlichen Zustandsautomaten. Mehr...
Kopfzeile: | #include <QStateMachine> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS StateMachine) target_link_libraries(mytarget PRIVATE Qt6::StateMachine) |
qmake: | QT += statemachine |
Vererbt: | QState |
Hinweis: Alle Funktionen in dieser Klasse sind reentrant.
Hinweis: Diese Funktionen sind auch thread-sicher:
- postEvent(QEvent *Ereignis, QStateMachine::EventPriority Priorität)
- postDelayedEvent(QEvent *Ereignis, int Verzögerung)
- cancelDelayedEvent(int id)
- postDelayedEvent(QEvent *Ereignis, std::chrono::milliseconds delay)
Öffentliche Typen
class | SignalEvent |
class | WrappedEvent |
enum | Error { NoError, NoInitialStateError, NoDefaultStateInHistoryStateError, NoCommonAncestorForTransitionError, StateMachineChildModeSetToParallelError } |
enum | EventPriority { NormalPriority, HighPriority } |
Eigenschaften
- animated : bool
- errorString : QString
- globalRestorePolicy : QState::RestorePolicy
- running : bool
Öffentliche Funktionen
QStateMachine(QObject *parent = nullptr) | |
virtual | ~QStateMachine() |
void | addDefaultAnimation(QAbstractAnimation *animation) |
void | addState(QAbstractState *state) |
QBindable<bool> | bindableAnimated() |
QBindable<QString> | bindableErrorString() const |
QBindable<QState::RestorePolicy> | bindableGlobalRestorePolicy() |
bool | cancelDelayedEvent(int id) |
void | clearError() |
QSet<QAbstractState *> | configuration() const |
QList<QAbstractAnimation *> | defaultAnimations() const |
QStateMachine::Error | error() const |
QString | errorString() const |
QState::RestorePolicy | globalRestorePolicy() const |
bool | isAnimated() const |
bool | isRunning() const |
int | postDelayedEvent(QEvent *event, int delay) |
int | postDelayedEvent(QEvent *event, std::chrono::milliseconds delay) |
void | postEvent(QEvent *event, QStateMachine::EventPriority priority = NormalPriority) |
void | removeDefaultAnimation(QAbstractAnimation *animation) |
void | removeState(QAbstractState *state) |
void | setAnimated(bool enabled) |
void | setGlobalRestorePolicy(QState::RestorePolicy restorePolicy) |
Reimplementierte öffentliche Funktionen
virtual bool | eventFilter(QObject *watched, QEvent *event) override |
Öffentliche Slots
void | setRunning(bool running) |
void | start() |
void | stop() |
Signale
void | runningChanged(bool running) |
void | started() |
void | stopped() |
Reimplementierte geschützte Funktionen
virtual bool | event(QEvent *e) override |
virtual void | onEntry(QEvent *event) override |
virtual void | onExit(QEvent *event) override |
Detaillierte Beschreibung
QStateMachine basiert auf den Konzepten und der Notation von Statecharts. QStateMachine ist Teil des Qt State Machine Frameworks.
Ein Zustandsautomat verwaltet eine Menge von Zuständen (Klassen, die von QAbstractState erben) und Übergängen (Nachkommen von QAbstractTransition) zwischen diesen Zuständen; diese Zustände und Übergänge definieren einen Zustandsgraphen. Sobald ein Zustandsgraph erstellt wurde, kann der Zustandsautomat ihn ausführen. Der Ausführungsalgorithmus von QStateMachine basiert auf dem State Chart XML (SCXML) Algorithmus. Die Übersicht des Frameworks enthält mehrere Zustandsgraphen und den Code, um sie zu erstellen.
Verwenden Sie die Funktion addState(), um dem Zustandsautomaten einen Top-Level-Zustand hinzuzufügen. Zustände werden mit der Funktion removeState() entfernt. Es wird davon abgeraten, Zustände zu entfernen, während der Rechner läuft.
Bevor der Rechner gestartet werden kann, muss die initial state gesetzt werden. Der Anfangszustand ist der Zustand, in den der Rechner beim Start übergeht. Sie können dann start() den Automaten starten. Das Signal started() wird ausgegeben, wenn der Ausgangszustand erreicht ist.
Der Automat ist ereignisgesteuert und führt seine eigene Ereignisschleife. Ereignisse werden über postEvent() an den Automaten gesendet. Beachten Sie, dass dies bedeutet, dass die Maschine asynchron ausgeführt wird und dass sie ohne eine laufende Ereignisschleife nicht vorankommt. Normalerweise müssen Sie keine Ereignisse direkt an die Maschine senden, da die Qt-Übergänge, z. B. QEventTransition und seine Unterklassen, dies erledigen. Aber für eigene Übergänge, die durch Ereignisse ausgelöst werden, ist postEvent() nützlich.
Der Zustandsautomat verarbeitet Ereignisse und führt Übergänge aus, bis ein Endzustand der obersten Ebene erreicht ist; dann gibt der Zustandsautomat das Signal finished() aus. Sie können den Zustandsautomaten auch explizit stop() aufrufen. In diesem Fall wird das Signal stopped() ausgegeben.
Der folgende Ausschnitt zeigt einen Zustandsautomaten, der beendet wird, wenn eine Schaltfläche angeklickt wird:
QPushButton button; QStateMachine machine; QState *s1 = new QState(); s1->assignProperty(&button, "text", "Click me"); QFinalState *s2 = new QFinalState(); s1->addTransition(&button, &QPushButton::clicked, s2); machine.addState(s1); machine.addState(s2); machine.setInitialState(s1); machine.start();
Dieses Codebeispiel verwendet QState, das von QAbstractState erbt. Die Klasse QState stellt einen Zustand zur Verfügung, den Sie verwenden können, um Eigenschaften zu setzen und Methoden auf QObjectaufzurufen, wenn der Zustand betreten oder verlassen wird. Sie enthält auch Komfortfunktionen zum Hinzufügen von Übergängen, z. B. QSignalTransitions wie in diesem Beispiel. Weitere Einzelheiten finden Sie in der Beschreibung der Klasse QState.
Wenn ein Fehler auftritt, sucht die Maschine nach einem error state, und wenn einer vorhanden ist, tritt sie in diesen Zustand ein. Die möglichen Fehlertypen werden durch die Aufzählung Error beschrieben. Nachdem der Fehlerzustand eingetreten ist, kann die Art des Fehlers mit error() abgefragt werden. Die Ausführung des Zustandsgraphen wird nicht angehalten, wenn der Fehlerzustand erreicht ist. Trifft kein Fehlerzustand auf den fehlerhaften Zustand zu, stoppt die Ausführung des Automaten und es wird eine Fehlermeldung auf der Konsole ausgegeben.
Hinweis: Wichtig: Die Einstellung ChildMode eines Zustandsautomaten auf parallel (ParallelStates) führt zu einem ungültigen Zustandsautomaten. Er kann nur auf ExclusiveStates gesetzt (oder als solcher beibehalten) werden.
Siehe auch QAbstractState, QAbstractTransition, QState, und Qt State Machine Übersicht.
Dokumentation der Mitgliedstypen
enum QStateMachine::Error
Dieser Enum-Typ definiert Fehler, die zur Laufzeit im Zustandsautomaten auftreten können. Wenn der Zustandsautomat zur Laufzeit auf einen nicht behebbaren Fehler stößt, setzt er den von error() zurückgegebenen Fehlercode, die von errorString() zurückgegebene Fehlermeldung und tritt in einen Fehlerzustand ein, der auf dem Kontext des Fehlers basiert.
Konstante | Wert | Beschreibung |
---|---|---|
QStateMachine::NoError | 0 | Es ist kein Fehler aufgetreten. |
QStateMachine::NoInitialStateError | 1 | Die Maschine ist in eine QState mit Kindern eingetreten, für die kein Anfangszustand festgelegt ist. Der Kontext dieses Fehlers ist der Zustand, in dem ein Anfangszustand fehlt. |
QStateMachine::NoDefaultStateInHistoryStateError | 2 | Die Maschine hat eine QHistoryState eingegeben, für die kein Standardzustand festgelegt ist. Der Kontext dieses Fehlers ist der QHistoryState, in dem ein Standardzustand fehlt. |
QStateMachine::NoCommonAncestorForTransitionError | 3 | Die Maschine hat einen Übergang ausgewählt, dessen Quelle und Ziele nicht zum selben Zustandsbaum und somit nicht zum selben Zustandsautomaten gehören. Im Allgemeinen kann dies bedeuten, dass einem der Zustände kein Elternteil zugewiesen oder zu einem Automaten hinzugefügt wurde. Der Kontext dieses Fehlers ist der Quellzustand des Übergangs. |
QStateMachine::StateMachineChildModeSetToParallelError | 4 | Die Eigenschaft childMode des Automaten wurde auf QState::ParallelStates gesetzt. Dies ist unzulässig. Nur Zustände dürfen als parallel deklariert werden, nicht der Automat selbst. Dieser enum-Wert wurde in Qt 5.14 hinzugefügt. |
Siehe auch setErrorState().
enum QStateMachine::EventPriority
Dieser Enum-Typ gibt die Priorität eines Ereignisses an, das mit postEvent() an den Zustandsautomaten gesendet wird.
Ereignisse mit hoher Priorität werden vor Ereignissen mit normaler Priorität verarbeitet.
Konstante | Wert | Beschreibung |
---|---|---|
QStateMachine::NormalPriority | 0 | Das Ereignis hat normale Priorität. |
QStateMachine::HighPriority | 1 | Das Ereignis hat eine hohe Priorität. |
Eigenschaft Dokumentation
[bindable]
animated : bool
Hinweis: Diese Eigenschaft unterstützt QProperty Bindungen.
Diese Eigenschaft gibt an, ob Animationen aktiviert sind.
Der Standardwert für diese Eigenschaft ist true
.
Siehe auch QAbstractTransition::addAnimation()
[bindable read-only]
errorString : QString
Hinweis: Diese Eigenschaft unterstützt QProperty Bindungen.
Diese Eigenschaft enthält den Fehlerstring dieses Zustandsautomaten
[bindable]
globalRestorePolicy : QState::RestorePolicy
Hinweis: Diese Eigenschaft unterstützt QProperty Bindungen.
Diese Eigenschaft enthält die Wiederherstellungsrichtlinie für Zustände dieses Zustandsautomaten.
Der Standardwert für diese Eigenschaft ist QState::DontRestoreProperties.
running : bool
Diese Eigenschaft enthält den laufenden Zustand dieses Zustandsautomaten
Zugriffsfunktionen:
bool | isRunning() const |
void | setRunning(bool running) |
Benachrichtigungssignal:
void | runningChanged(bool running) |
Siehe auch start(), stop(), started(), stopped(), und runningChanged().
Dokumentation der Mitgliedsfunktionen
[explicit]
QStateMachine::QStateMachine(QObject *parent = nullptr)
Konstruiert einen neuen Zustandsautomaten mit der angegebenen parent.
[virtual noexcept]
QStateMachine::~QStateMachine()
Zerstört diesen Zustandsautomaten.
void QStateMachine::addDefaultAnimation(QAbstractAnimation *animation)
Fügt einen Standard animation hinzu, der bei jedem Übergang berücksichtigt wird.
void QStateMachine::addState(QAbstractState *state)
Fügt die angegebene state zu diesem Zustandsautomaten hinzu. Der Zustand wird zu einem Top-Level-Zustand, und der Zustandsautomat übernimmt die Verantwortung für den Zustand.
Befindet sich der Zustand bereits in einem anderen Automaten, wird er zunächst aus dem alten Automaten entfernt und dann zu diesem Automaten hinzugefügt.
Siehe auch removeState() und setInitialState().
bool QStateMachine::cancelDelayedEvent(int id)
Bricht das verzögerte Ereignis ab, das durch die angegebene id identifiziert wird. Die id sollte ein Wert sein, der durch einen Aufruf von postDelayedEvent() zurückgegeben wird. Gibt true
zurück, wenn das Ereignis erfolgreich abgebrochen wurde, andernfalls wird false
zurückgegeben.
Hinweis: Diese Funktion ist thread-sicher.
Siehe auch postDelayedEvent().
void QStateMachine::clearError()
Löscht den Fehlerstring und den Fehlercode des Zustandsautomaten.
QSet<QAbstractState *> QStateMachine::configuration() const
Gibt die maximal konsistente Menge von Zuständen (einschließlich Parallel- und Endzuständen) zurück, in denen sich dieser Zustandsautomat gerade befindet. Wenn sich ein Zustand s
in der Konfiguration befindet, ist es immer der Fall, dass sich der Elternteil von s
auch in c befindet. Beachten Sie jedoch, dass der Automat selbst kein explizites Mitglied der Konfiguration ist.
QList<QAbstractAnimation *> QStateMachine::defaultAnimations() const
Gibt die Liste der Standardanimationen zurück, die für jeden Übergang berücksichtigt werden.
QStateMachine::Error QStateMachine::error() const
Gibt den Fehlercode des letzten Fehlers zurück, der im Zustandsautomaten aufgetreten ist.
QString QStateMachine::errorString() const
Gibt den Fehlerstring des letzten Fehlers zurück, der im Zustandsautomaten aufgetreten ist.
Hinweis: Getter-Funktion für die Eigenschaft errorString.
[override virtual protected]
bool QStateMachine::event(QEvent *e)
Reimplements: QState::event(QEvent *e).
[override virtual]
bool QStateMachine::eventFilter(QObject *watched, QEvent *event)
Reimplements: QObject::eventFilter(QObject *watched, QEvent *event).
QState::RestorePolicy QStateMachine::globalRestorePolicy() const
Gibt die Wiederherstellungsrichtlinie des Zustandsautomaten zurück.
Hinweis: Getter-Funktion für die Eigenschaft globalRestorePolicy.
Siehe auch setGlobalRestorePolicy().
bool QStateMachine::isAnimated() const
Gibt zurück, ob Animationen für diesen Zustandsautomaten aktiviert sind.
Hinweis: Getter-Funktion für die Eigenschaft animated.
[override virtual protected]
void QStateMachine::onEntry(QEvent *event)
Reimplements: QState::onEntry(QEvent *event).
Diese Funktion ruft start() auf, um den Zustandsautomaten zu starten.
[override virtual protected]
void QStateMachine::onExit(QEvent *event)
Reimplements: QState::onExit(QEvent *event).
Diese Funktion ruft stop() auf, um den Zustandsautomaten anzuhalten und anschließend das Signal stopped() auszusenden.
int QStateMachine::postDelayedEvent(QEvent *event, int delay)
Sendet das angegebene event zur Verarbeitung durch diesen Zustandsautomaten, mit der angegebenen delay in Millisekunden. Gibt einen Bezeichner zurück, der mit dem verzögerten Ereignis verbunden ist, oder -1, wenn das Ereignis nicht gesendet werden konnte.
Diese Funktion kehrt sofort zurück. Wenn die Verzögerungszeit abgelaufen ist, wird das Ereignis zur Verarbeitung in die Ereigniswarteschlange des Zustandsautomaten aufgenommen. Der Zustandsautomat übernimmt die Verantwortung für das Ereignis und löscht es, sobald es verarbeitet wurde.
Sie können Ereignisse nur veröffentlichen, wenn der Zustandsautomat läuft.
Hinweis: Diese Funktion ist thread-sicher.
Siehe auch cancelDelayedEvent() und postEvent().
int QStateMachine::postDelayedEvent(QEvent *event, std::chrono::milliseconds delay)
Dies ist eine überladene Funktion.
Sendet das angegebene event zur Verarbeitung durch diesen Zustandsautomaten, mit der angegebenen delay in Millisekunden. Gibt einen Bezeichner zurück, der mit dem verzögerten Ereignis verbunden ist, oder -1, wenn das Ereignis nicht gesendet werden konnte.
Diese Funktion kehrt sofort zurück. Wenn die Verzögerungszeit abgelaufen ist, wird das Ereignis zur Verarbeitung in die Ereigniswarteschlange des Zustandsautomaten aufgenommen. Der Zustandsautomat übernimmt die Verantwortung für das Ereignis und löscht es, sobald es verarbeitet wurde.
Sie können Ereignisse nur veröffentlichen, wenn der Zustandsautomat läuft.
Hinweis: Diese Funktion ist thread-sicher.
Siehe auch cancelDelayedEvent() und postEvent().
void QStateMachine::postEvent(QEvent *event, QStateMachine::EventPriority priority = NormalPriority)
Sendet die angegebene event der angegebenen priority zur Verarbeitung durch diesen Zustandsautomaten.
Diese Funktion kehrt sofort zurück. Das Ereignis wird der Ereigniswarteschlange des Zustandsautomaten hinzugefügt. Die Ereignisse werden in der Reihenfolge ihres Eingangs verarbeitet. Der Zustandsautomat wird Eigentümer des Ereignisses und löscht es, sobald es abgearbeitet ist.
Sie können Ereignisse nur senden, wenn der Zustandsautomat läuft oder wenn er hochgefahren wird.
Hinweis: Diese Funktion ist thread-sicher.
Siehe auch postDelayedEvent().
void QStateMachine::removeDefaultAnimation(QAbstractAnimation *animation)
Entfernt animation aus der Liste der Standardanimationen.
void QStateMachine::removeState(QAbstractState *state)
Entfernt den angegebenen state aus diesem Zustandsautomaten. Der Zustandsautomat gibt das Eigentum an dem Zustand frei.
Siehe auch addState().
[signal]
void QStateMachine::runningChanged(bool running)
Dieses Signal wird ausgesendet, wenn die laufende Eigenschaft mit running als Argument geändert wird.
Hinweis: Meldersignal für die Eigenschaft running.
Siehe auch QStateMachine::running.
void QStateMachine::setAnimated(bool enabled)
Legt fest, ob Animationen für diesen Zustandsautomaten enabled sind.
Hinweis: Setter-Funktion für die Eigenschaft animated.
Siehe auch isAnimated().
void QStateMachine::setGlobalRestorePolicy(QState::RestorePolicy restorePolicy)
Setzt die Wiederherstellungsrichtlinie des Zustandsautomaten auf restorePolicy. Die Standardwiederherstellungsrichtlinie ist QState::DontRestoreProperties.
Hinweis: Setter-Funktion für die Eigenschaft globalRestorePolicy.
Siehe auch globalRestorePolicy().
[slot]
void QStateMachine::start()
Startet diesen Zustandsautomaten. Der Rechner setzt seine Konfiguration zurück und geht in den Ausgangszustand über. Wenn ein endgültiger Top-Level-Zustand (QFinalState) erreicht ist, gibt der Automat das Signal finished() aus.
Hinweis: Ein Zustandsautomat läuft nicht ohne eine laufende Ereignisschleife, wie z. B. die Ereignisschleife der Hauptanwendung, die mit QCoreApplication::exec() oder QApplication::exec() gestartet wurde.
Siehe auch started(), finished(), stop(), initialState(), und setRunning().
[private signal]
void QStateMachine::started()
Dieses Signal wird ausgegeben, wenn der Zustandsautomat seinen Anfangszustand erreicht hat (QStateMachine::initialState).
Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, aber nicht vom Benutzer ausgegeben werden.
Siehe auch QStateMachine::finished() und QStateMachine::start().
[slot]
void QStateMachine::stop()
Hält diesen Zustandsautomaten an. Der Zustandsautomat hält die Verarbeitung von Ereignissen an und gibt dann das Signal stopped() aus.
Siehe auch stopped(), start(), und setRunning().
[private signal]
void QStateMachine::stopped()
Dieses Signal wird ausgegeben, wenn der Zustandsautomat angehalten hat.
Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, aber nicht vom Benutzer ausgegeben werden.
Siehe auch QStateMachine::stop() und QStateMachine::finished().
© 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.