Sur cette page

QStateMachine Class

La classe QStateMachine fournit un automate à états finis hiérarchique. Plus d'informations...

En-tête : #include <QStateMachine>
CMake : find_package(Qt6 REQUIRED COMPONENTS StateMachine)
target_link_libraries(mytarget PRIVATE Qt6::StateMachine)
qmake : QT += statemachine
Héritages : QState

Note : Toutes les fonctions de cette classe sont réentrantes.

Note : Ces fonctions sont également sûres pour les threads:

Types publics

class SignalEvent
class WrappedEvent
enum Error { NoError, NoInitialStateError, NoDefaultStateInHistoryStateError, NoCommonAncestorForTransitionError, StateMachineChildModeSetToParallelError }
enum EventPriority { NormalPriority, HighPriority }

Propriétés

Fonctions publiques

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)

Fonctions publiques réimplémentées

virtual bool eventFilter(QObject *watched, QEvent *event) override

Emplacements publics

void setRunning(bool running)
void start()
void stop()

Signaux

void runningChanged(bool running)
void started()
void stopped()

Fonctions protégées réimplémentées

virtual bool event(QEvent *e) override
virtual void onEntry(QEvent *event) override
virtual void onExit(QEvent *event) override

Description détaillée

QStateMachine est basé sur les concepts et la notation des Statecharts. QStateMachine fait partie du cadreQt State Machine .

Une machine à états gère un ensemble d'états (classes héritant de QAbstractState) et de transitions (descendants de QAbstractTransition) entre ces états ; ces états et transitions définissent un graphe d'états. Une fois qu'un graphe d'états a été construit, la machine à états peut l'exécuter. L'algorithme d'exécution de QStateMachine est basé sur l'algorithme State Chart XML (SCXML). La vue d'ensemble du framework donne plusieurs graphes d'état et le code pour les construire.

La fonction addState() permet d'ajouter un état de niveau supérieur à la machine à états. Les états sont supprimés à l'aide de la fonction removeState(). Il est déconseillé de supprimer des états lorsque la machine est en cours d'exécution.

Avant que la machine puisse être démarrée, l'état initial state doit être défini. L'état initial est l'état dans lequel la machine entre lorsqu'elle est démarrée. Vous pouvez ensuite start() la machine à états. Le signal started() est émis lorsque l'état initial est atteint.

La machine est pilotée par les événements et conserve sa propre boucle d'événements. Les événements sont envoyés à la machine par l'intermédiaire de postEvent(). Notez que cela signifie qu'elle s'exécute de manière asynchrone et qu'elle ne progressera pas sans une boucle d'événements en cours d'exécution. Normalement, vous n'aurez pas à envoyer directement des événements à la machine, car les transitions de Qt, par exemple QEventTransition et ses sous-classes, s'en chargent. Mais pour les transitions personnalisées déclenchées par des événements, postEvent() est utile.

La machine d'état traite les événements et prend des transitions jusqu'à ce qu'un état final de haut niveau soit entré ; la machine d'état émet alors le signal finished(). Vous pouvez également stop() explicitement l'automate à états. Dans ce cas, le signal stopped() est émis.

L'extrait suivant montre un automate à états qui se termine lorsqu'un bouton est cliqué :

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();

Cet exemple de code utilise QState, qui hérite de QAbstractState. La classe QState fournit un état que vous pouvez utiliser pour définir des propriétés et invoquer des méthodes sur les QObjectlorsque l'état est entré ou sorti. Elle contient également des fonctions de commodité permettant d'ajouter des transitions, par exemple QSignalTransitions comme dans cet exemple. Voir la description de la classe QState pour plus de détails.

Si une erreur est rencontrée, la machine cherchera une error state, et si une erreur est disponible, elle entrera dans cet état. Les types d'erreurs possibles sont décrits par l'énumération Error. Une fois que l'état d'erreur est entré, le type d'erreur peut être récupéré avec error(). L'exécution du graphe d'état ne s'arrête pas à l'entrée de l'état d'erreur. Si aucun état d'erreur ne s'applique à l'état erroné, la machine cessera de s'exécuter et un message d'erreur sera imprimé sur la console.

Remarque : Important : le fait de définir ChildMode d'un automate à états sur parallèle (ParallelStates) entraîne l'apparition d'un automate à états non valide. Il ne peut être défini (ou conservé) qu'à l'adresse ExclusiveStates.

Voir aussi QAbstractState, QAbstractTransition, QState, et Qt State Machine Aperçu.

Documentation sur les types de membres

enum QStateMachine::Error

Ce type d'énumération définit les erreurs qui peuvent se produire dans l'automate d'état au moment de l'exécution. Lorsque la machine à états rencontre une erreur irrécupérable au moment de l'exécution, elle définit le code d'erreur renvoyé par error(), le message d'erreur renvoyé par errorString() et entre dans un état d'erreur basé sur le contexte de l'erreur.

ConstanteValeurDescription de l'erreur
QStateMachine::NoError0Aucune erreur ne s'est produite.
QStateMachine::NoInitialStateError1La machine est entrée dans un QState avec des enfants qui n'ont pas d'état initial défini. Le contexte de cette erreur est l'état auquel il manque un état initial.
QStateMachine::NoDefaultStateInHistoryStateError2La machine est entrée dans un QHistoryState dont l'état par défaut n'est pas défini. Le contexte de cette erreur est le site QHistoryState auquel il manque un état par défaut.
QStateMachine::NoCommonAncestorForTransitionError3La machine a sélectionné une transition dont la source et les cibles ne font pas partie du même arbre d'états, et ne font donc pas partie de la même machine à états. En général, cela peut signifier que l'un des états n'a pas reçu de parent ou n'a pas été ajouté à une machine. Le contexte de cette erreur est l'état source de la transition.
QStateMachine::StateMachineChildModeSetToParallelError4La propriété childMode de la machine a été définie à QState::ParallelStates, ce qui est illégal. Seuls les états peuvent être déclarés comme parallèles, pas la machine à états elle-même. Cette valeur d'énumération a été ajoutée dans Qt 5.14.

Voir aussi setErrorState().

enum QStateMachine::EventPriority

Ce type d'énumération spécifie la priorité d'un événement envoyé à la machine d'état à l'aide de postEvent().

Les événements de priorité élevée sont traités avant les événements de priorité normale.

ConstanteValeurDescription de l'événement
QStateMachine::NormalPriority0L'événement a une priorité normale.
QStateMachine::HighPriority1L'événement a une priorité élevée.

Propriété Documentation

[bindable] animated : bool

Remarque : cette propriété prend en charge les liens QProperty.

Cette propriété indique si les animations sont activées

La valeur par défaut de cette propriété est true.

Voir aussi QAbstractTransition::addAnimation()

Fonctions d'accès :

bool isAnimated() const
void setAnimated(bool enabled)

[bindable read-only] errorString : QString

Remarque : Cette propriété prend en charge les liaisons QProperty.

Cette propriété contient la chaîne d'erreur de cette machine d'état.

Fonctions d'accès :

QString errorString() const

[bindable] globalRestorePolicy : QState::RestorePolicy

Remarque : Cette propriété prend en charge les liaisons QProperty.

Cette propriété contient la politique de restauration des états de cette machine à états.

La valeur par défaut de cette propriété est QState::DontRestoreProperties.

Fonctions d'accès :

QState::RestorePolicy globalRestorePolicy() const
void setGlobalRestorePolicy(QState::RestorePolicy restorePolicy)

running : bool

Cette propriété contient l'état de fonctionnement de cette machine à états.

Fonctions d'accès :

bool isRunning() const
void setRunning(bool running)

Signal de notification :

void runningChanged(bool running)

Voir aussi start(), stop(), started(), stopped() et runningChanged().

Documentation des fonctions membres

[explicit] QStateMachine::QStateMachine(QObject *parent = nullptr)

Construit un nouvel automate à états avec l'adresse parent.

[virtual noexcept] QStateMachine::~QStateMachine()

Détruit cette machine d'état.

void QStateMachine::addDefaultAnimation(QAbstractAnimation *animation)

Ajoute une adresse animation par défaut à prendre en compte pour toute transition.

void QStateMachine::addState(QAbstractState *state)

Ajoute l'adresse state à cet automate à états. L'état devient un état de premier niveau et la machine à états en devient propriétaire.

Si l'état se trouve déjà dans une autre machine, il sera d'abord supprimé de son ancienne machine, puis ajouté à cette machine.

Voir aussi removeState() et setInitialState().

bool QStateMachine::cancelDelayedEvent(int id)

Annule l'événement retardé identifié par l'adresse id. L'identifiant doit être une valeur renvoyée par un appel à postDelayedEvent(). Retourne true si l'événement a été annulé avec succès, sinon retourne false.

Remarque : cette fonction est sûre pour les threads.

Voir aussi postDelayedEvent().

void QStateMachine::clearError()

Efface la chaîne d'erreur et le code d'erreur de la machine d'état.

QSet<QAbstractState *> QStateMachine::configuration() const

Renvoie l'ensemble cohérent maximal d'états (y compris les états parallèles et finaux) dans lequel se trouve actuellement cette machine à états. Si un état s est dans la configuration, il est toujours possible que le parent de s soit également dans c. Notez cependant que la machine elle-même n'est pas un membre explicite de la configuration.

QList<QAbstractAnimation *> QStateMachine::defaultAnimations() const

Renvoie la liste des animations par défaut qui seront prises en compte pour toute transition.

QStateMachine::Error QStateMachine::error() const

Renvoie le code d'erreur de la dernière erreur survenue dans la machine à états.

QString QStateMachine::errorString() const

Renvoie la chaîne d'erreur de la dernière erreur survenue dans la machine d'état.

Remarque : fonction Getter pour la propriété errorString.

[override virtual protected] bool QStateMachine::event(QEvent *e)

Réimplémente : QState::event(QEvent *e).

[override virtual] bool QStateMachine::eventFilter(QObject *watched, QEvent *event)

Réimplémente : QObject::eventFilter(QObject *watched, QEvent *event).

QState::RestorePolicy QStateMachine::globalRestorePolicy() const

Renvoie la politique de restauration de la machine à états.

Remarque : fonction Getter pour la propriété globalRestorePolicy.

Voir également setGlobalRestorePolicy().

bool QStateMachine::isAnimated() const

Indique si les animations sont activées pour cette machine d'état.

Remarque : fonction Getter pour la propriété animated.

[override virtual protected] void QStateMachine::onEntry(QEvent *event)

Réimplémente : QState::onEntry(QEvent *event).

Cette fonction appelle start() pour démarrer la machine à états.

[override virtual protected] void QStateMachine::onExit(QEvent *event)

Réimplémente : QState::onExit(QEvent *event).

Cette fonction appellera stop() pour arrêter la machine à états et émettra ensuite le signal stopped().

int QStateMachine::postDelayedEvent(QEvent *event, int delay)

Publie l'événement event pour traitement par cette machine d'état, avec la valeur delay en millisecondes. Retourne un identifiant associé à l'événement retardé, ou -1 si l'événement n'a pas pu être posté.

Cette fonction revient immédiatement. À l'expiration du délai, l'événement est ajouté à la file d'attente des événements de l'automate à états pour être traité. L'automate d'état devient propriétaire de l'événement et le supprime une fois qu'il a été traité.

Vous ne pouvez poster des événements que lorsque la machine à états est en cours d'exécution.

Remarque : cette fonction est à l'épreuve des threads.

Voir aussi cancelDelayedEvent() et postEvent().

int QStateMachine::postDelayedEvent(QEvent *event, std::chrono::milliseconds delay)

Publie l'événement event pour traitement par cette machine d'état, avec la valeur delay en millisecondes. Retourne un identifiant associé à l'événement retardé, ou -1 si l'événement n'a pas pu être posté.

Cette fonction revient immédiatement. À l'expiration du délai, l'événement est ajouté à la file d'attente des événements de l'automate à états pour être traité. L'automate d'état devient propriétaire de l'événement et le supprime une fois qu'il a été traité.

Vous ne pouvez poster des événements que lorsque l'automate d'état est en cours d'exécution.

Il s'agit d'une fonction surchargée.

Remarque : cette fonction est à l'épreuve des threads.

Voir aussi cancelDelayedEvent() et postEvent().

void QStateMachine::postEvent(QEvent *event, QStateMachine::EventPriority priority = NormalPriority)

Affiche le site event du site priority pour qu'il soit traité par cette machine d'état.

Cette fonction est renvoyée immédiatement. L'événement est ajouté à la file d'attente d'événements de la machine à états. Les événements sont traités dans l'ordre dans lequel ils ont été postés. La machine à états prend possession de l'événement et le supprime une fois qu'il a été traité.

Vous ne pouvez poster des événements que lorsque l'automate à états est en cours d'exécution ou lorsqu'il démarre.

Remarque : cette fonction est à l'épreuve des threads.

Voir aussi postDelayedEvent().

void QStateMachine::removeDefaultAnimation(QAbstractAnimation *animation)

Supprime animation de la liste des animations par défaut.

void QStateMachine::removeState(QAbstractState *state)

Supprime l'adresse state de cet automate d'état. La machine à états libère la propriété de l'état.

Voir également addState().

[signal] void QStateMachine::runningChanged(bool running)

Ce signal est émis lorsque la propriété en cours d'exécution est modifiée avec running comme argument.

Note : Signal de notification pour la propriété running.

Voir aussi QStateMachine::running.

void QStateMachine::setAnimated(bool enabled)

Définit si les animations sont enabled pour cette machine d'état.

Remarque : fonction de définition de la propriété animated.

Voir également isAnimated().

void QStateMachine::setGlobalRestorePolicy(QState::RestorePolicy restorePolicy)

Définit la politique de restauration de la machine à états à restorePolicy. La politique de restauration par défaut est QState::DontRestoreProperties.

Remarque : fonction de définition de la propriété globalRestorePolicy.

Voir également globalRestorePolicy().

[slot] void QStateMachine::start()

Démarre cette machine d'état. La machine réinitialise sa configuration et passe à l'état initial. Lorsqu'un état final de niveau supérieur (QFinalState) est atteint, la machine émet le signal finished().

Remarque : une machine à états ne fonctionnera pas sans une boucle d'événements en cours, telle que la boucle d'événements de l'application principale lancée avec QCoreApplication::exec() ou QApplication::exec().

Voir également started(), finished(), stop(), initialState() et setRunning().

[private signal] void QStateMachine::started()

Ce signal est émis lorsque la machine à états est entrée dans son état initial (QStateMachine::initialState).

Remarque : il s'agit d'un signal privé. Il peut être utilisé dans les connexions de signaux mais ne peut pas être émis par l'utilisateur.

Voir aussi QStateMachine::finished() et QStateMachine::start().

[slot] void QStateMachine::stop()

Arrête cette machine à états. L'automate d'état cesse de traiter les événements et émet alors le signal stopped().

Voir également stopped(), start() et setRunning().

[private signal] void QStateMachine::stopped()

Ce signal est émis lorsque la machine à états s'est arrêtée.

Remarque : il s'agit d'un signal privé. Il peut être utilisé dans les connexions de signaux mais ne peut pas être émis par l'utilisateur.

Voir aussi QStateMachine::stop() et QStateMachine::finished().

© 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.