QStateMachine Class
La clase QStateMachine proporciona una máquina de estados finitos jerárquica. Más...
| Cabecera: | #include <QStateMachine> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS StateMachine)target_link_libraries(mytarget PRIVATE Qt6::StateMachine) |
| qmake: | QT += statemachine |
| Hereda: | QState |
Nota: Todas las funciones de esta clase son reentrantes.
Nota: Estas funciones también son thread-safe:
- postEvent(QEvent *event, QStateMachine::EventPriority prioridad)
- postDelayedEvent(QEvent *event, int retraso)
- cancelDelayedEvent(int id)
- postDelayedEvent(QEvent *event, std::chrono::milisegundos retardo)
Tipos Públicos
| class | SignalEvent |
| class | WrappedEvent |
| enum | Error { NoError, NoInitialStateError, NoDefaultStateInHistoryStateError, NoCommonAncestorForTransitionError, StateMachineChildModeSetToParallelError } |
| enum | EventPriority { NormalPriority, HighPriority } |
Propiedades
- animated : bool
- errorString : QString
- globalRestorePolicy : QState::RestorePolicy
- running : bool
Funciones públicas
| 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) |
Funciones públicas reimplementadas
| virtual bool | eventFilter(QObject *watched, QEvent *event) override |
Ranuras públicas
| void | setRunning(bool running) |
| void | start() |
| void | stop() |
Señales
| void | runningChanged(bool running) |
| void | started() |
| void | stopped() |
Funciones protegidas reimplementadas
| virtual bool | event(QEvent *e) override |
| virtual void | onEntry(QEvent *event) override |
| virtual void | onExit(QEvent *event) override |
Descripción Detallada
QStateMachine está basado en los conceptos y notación de Statecharts. QStateMachine forma parte de Qt State Machine Framework.
Una máquina de estados gestiona un conjunto de estados (clases que heredan de QAbstractState) y transiciones (descendientes de QAbstractTransition) entre esos estados; estos estados y transiciones definen un grafo de estados. Una vez construido un grafo de estados, la máquina de estados puede ejecutarlo. El algoritmo de ejecución de QStateMachine se basa en el algoritmo State Chart XML (SCXML). La visión general del framework proporciona varios gráficos de estado y el código para construirlos.
Utilice la función addState() para añadir un estado de nivel superior a la máquina de estados. Los estados se eliminan con la función removeState(). Se desaconseja eliminar estados mientras la máquina está funcionando.
Antes de poder arrancar la máquina, se debe establecer el initial state. El estado inicial es el estado en el que entra la máquina al arrancar. A continuación, puede start() la máquina de estados. La señal started() se emite cuando se entra en el estado inicial.
La máquina es dirigida por eventos y mantiene su propio bucle de eventos. Los eventos se envían a la máquina a través de postEvent(). Tenga en cuenta que esto significa que se ejecuta de forma asíncrona, y que no progresará sin un bucle de eventos en ejecución. Normalmente no tendrás que enviar eventos a la máquina directamente, ya que las transiciones de Qt, por ejemplo, QEventTransition y sus subclases, se encargan de ello. Pero para transiciones personalizadas disparadas por eventos, postEvent() es útil.
La máquina de estados procesa eventos y toma transiciones hasta que se entra en un estado final de nivel superior; la máquina de estados emite entonces la señal finished(). También puedes stop() la máquina de estados explícitamente. En este caso se emite la señal stopped().
El siguiente fragmento de código muestra una máquina de estados que finalizará cuando se pulse un botón:
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();
Este ejemplo de código utiliza QState, que hereda de QAbstractState. La clase QState proporciona un estado que puede utilizar para establecer propiedades e invocar métodos en QObjects cuando se entra o se sale del estado. También contiene funciones de conveniencia para añadir transiciones, por ejemplo, QSignalTransitions como en este ejemplo. Véase la descripción de la clase QState para más detalles.
Si se encuentra un error, la máquina buscará un error state, y si hay uno disponible, entrará en este estado. Los tipos de errores posibles se describen en el enum Error. Después de entrar en el estado de error, se puede recuperar el tipo de error con error(). La ejecución del gráfico de estados no se detendrá cuando se entre en el estado de error. Si no se aplica ningún estado de error al estado erróneo, la máquina dejará de ejecutarse y se imprimirá un mensaje de error en la consola.
Nota : Importante: establecer el ChildMode de una máquina de estados en paralelo (ParallelStates) resulta en una máquina de estados inválida. Sólo puede establecerse a (o mantenerse como) ExclusiveStates.
Véase también QAbstractState, QAbstractTransition, QState, y Qt State Machine Visión general.
Documentación de tipos de miembros
enum QStateMachine::Error
Este tipo de enum define los errores que pueden ocurrir en la máquina de estados en tiempo de ejecución. Cuando la máquina de estados encuentra un error irrecuperable en tiempo de ejecución, establecerá el código de error devuelto por error(), el mensaje de error devuelto por errorString(), y entrará en un estado de error basado en el contexto del error.
| Constante | Valor | Descripción |
|---|---|---|
QStateMachine::NoError | 0 | No se ha producido ningún error. |
QStateMachine::NoInitialStateError | 1 | La máquina ha entrado en un QState con hijos que no tiene un estado inicial establecido. El contexto de este error es el estado al que le falta un estado inicial. |
QStateMachine::NoDefaultStateInHistoryStateError | 2 | La máquina ha entrado en un QHistoryState que no tiene un estado inicial establecido. El contexto de este error es el QHistoryState al que le falta un estado por defecto. |
QStateMachine::NoCommonAncestorForTransitionError | 3 | La máquina ha seleccionado una transición cuyo origen y destino no forman parte del mismo árbol de estados y, por tanto, no forman parte de la misma máquina de estados. Comúnmente, esto podría significar que a uno de los estados no se le ha dado ningún padre ni se ha añadido a ninguna máquina. El contexto de este error es el estado origen de la transición. |
QStateMachine::StateMachineChildModeSetToParallelError | 4 | La propiedad childMode de la máquina se ha establecido en QState::ParallelStates. Esto es ilegal. Sólo los estados pueden ser declarados como paralelos, no la propia máquina de estados. Este valor enum se añadió en Qt 5.14. |
Véase también setErrorState().
enum QStateMachine::EventPriority
Este tipo de enum especifica la prioridad de un evento enviado a la máquina de estados mediante postEvent().
Los eventos de prioridad alta se procesan antes que los eventos de prioridad normal.
| Constante | Valor | Descripción |
|---|---|---|
QStateMachine::NormalPriority | 0 | El evento tiene prioridad normal. |
QStateMachine::HighPriority | 1 | El evento tiene prioridad alta. |
Documentación de la propiedad
[bindable] animated : bool
Nota: Esta propiedad soporta QProperty bindings.
Esta propiedad indica si las animaciones están habilitadas
El valor por defecto de esta propiedad es true.
Véase también QAbstractTransition::addAnimation()
Funciones de acceso:
| bool | isAnimated() const |
| void | setAnimated(bool enabled) |
[bindable read-only] errorString : QString
Nota: Esta propiedad admite los enlaces QProperty.
Esta propiedad contiene la cadena de error de esta máquina de estado
Funciones de acceso:
| QString | errorString() const |
[bindable] globalRestorePolicy : QState::RestorePolicy
Nota: Esta propiedad soporta QProperty bindings.
Esta propiedad contiene la política de restauración para los estados de esta máquina de estados.
El valor por defecto de esta propiedad es QState::DontRestoreProperties.
Funciones de acceso:
| QState::RestorePolicy | globalRestorePolicy() const |
| void | setGlobalRestorePolicy(QState::RestorePolicy restorePolicy) |
running : bool
Esta propiedad contiene el estado de ejecución de esta máquina de estado
Funciones de acceso:
| bool | isRunning() const |
| void | setRunning(bool running) |
Señal notificador:
| void | runningChanged(bool running) |
Véase también start(), stop(), started(), stopped(), y runningChanged().
Documentación de las funciones miembro
[explicit] QStateMachine::QStateMachine(QObject *parent = nullptr)
Construye una nueva máquina de estados con la dirección parent.
[virtual noexcept] QStateMachine::~QStateMachine()
Destruye esta máquina de estado.
void QStateMachine::addDefaultAnimation(QAbstractAnimation *animation)
Añade un animation por defecto que se tendrá en cuenta para cualquier transición.
void QStateMachine::addState(QAbstractState *state)
Añade el state dado a esta máquina de estados. El estado se convierte en un estado de nivel superior y la máquina de estados toma posesión del estado.
Si el estado ya está en una máquina diferente, primero será eliminado de su antigua máquina, y luego añadido a esta máquina.
Véase también removeState() y setInitialState().
bool QStateMachine::cancelDelayedEvent(int id)
Cancela el evento diferido identificado por el identificador id. El id debe ser un valor devuelto por una llamada a postDelayedEvent(). Devuelve true si el evento ha sido cancelado con éxito, en caso contrario devuelve false.
Nota: Esta función es thread-safe.
Véase también postDelayedEvent().
void QStateMachine::clearError()
Borra la cadena de error y el código de error de la máquina de estado.
QSet<QAbstractState *> QStateMachine::configuration() const
Devuelve el conjunto máximo consistente de estados (incluyendo estados paralelos y finales) en el que se encuentra actualmente esta máquina de estados. Si un estado s está en la configuración, siempre se da el caso de que el padre de s también está en c. Tenga en cuenta, sin embargo, que la propia máquina no es un miembro explícito de la configuración.
QList<QAbstractAnimation *> QStateMachine::defaultAnimations() const
Devuelve la lista de animaciones predeterminadas que se tendrán en cuenta para cualquier transición.
QStateMachine::Error QStateMachine::error() const
Devuelve el código de error del último error que se ha producido en la máquina de estados.
QString QStateMachine::errorString() const
Devuelve la cadena de error del último error ocurrido en la máquina de estado.
Nota: Función Getter para la propiedad errorString.
[override virtual protected] bool QStateMachine::event(QEvent *e)
Reimplementa: QState::event(QEvent *e).
[override virtual] bool QStateMachine::eventFilter(QObject *watched, QEvent *event)
Reimplementa: QObject::eventFilter(QObject *watched, QEvent *event).
QState::RestorePolicy QStateMachine::globalRestorePolicy() const
Devuelve la política de restauración de la máquina de estado.
Nota: Función Getter para la propiedad globalRestorePolicy.
Véase también setGlobalRestorePolicy().
bool QStateMachine::isAnimated() const
Devuelve si las animaciones están habilitadas para esta máquina de estados.
Nota: Función Getter para la propiedad animated.
[override virtual protected] void QStateMachine::onEntry(QEvent *event)
Reimplementa: QState::onEntry(QEvent *event).
Esta función llamará a start() para iniciar la máquina de estados.
[override virtual protected] void QStateMachine::onExit(QEvent *event)
Reimplementa: QState::onExit(QEvent *event).
Esta función llamará a stop() para detener la máquina de estados y posteriormente emitirá la señal stopped().
int QStateMachine::postDelayedEvent(QEvent *event, int delay)
Publica el evento event para ser procesado por esta máquina de estado, con el valor delay en milisegundos. Devuelve un identificador asociado con el evento retrasado, o -1 si el evento no pudo ser enviado.
Esta función devuelve inmediatamente. Cuando el retraso haya expirado, el evento se añadirá a la cola de eventos de la máquina de estado para su procesamiento. La máquina de estados toma posesión del evento y lo borra una vez que ha sido procesado.
Sólo se pueden enviar eventos cuando la máquina de estados está en ejecución.
Nota: Esta función es thread-safe.
Véase también cancelDelayedEvent() y postEvent().
int QStateMachine::postDelayedEvent(QEvent *event, std::chrono::milliseconds delay)
Publica el evento event para que sea procesado por esta máquina de estado, con el valor delay en milisegundos. Devuelve un identificador asociado con el evento retrasado, o -1 si el evento no pudo ser enviado.
Esta función devuelve inmediatamente. Cuando el retraso haya expirado, el evento se añadirá a la cola de eventos de la máquina de estado para su procesamiento. La máquina de estados toma posesión del evento y lo borra una vez que ha sido procesado.
Sólo se pueden enviar eventos cuando la máquina de estados está en ejecución.
Esta es una función sobrecargada.
Nota: Esta función es thread-safe.
Véase también cancelDelayedEvent() y postEvent().
void QStateMachine::postEvent(QEvent *event, QStateMachine::EventPriority priority = NormalPriority)
Publica el event dado del priority dado para ser procesado por esta máquina de estado.
Esta función retorna inmediatamente. El evento se añade a la cola de eventos de la máquina de estado. Los eventos se procesan en el orden de publicación. La máquina de estados toma posesión del evento y lo borra una vez que ha sido procesado.
Sólo se pueden enviar eventos cuando la máquina de estados está en ejecución o cuando se está iniciando.
Nota: Esta función es thread-safe.
Véase también postDelayedEvent().
void QStateMachine::removeDefaultAnimation(QAbstractAnimation *animation)
Elimina animation de la lista de animaciones por defecto.
void QStateMachine::removeState(QAbstractState *state)
Elimina el state dado de esta máquina de estados. La máquina de estados libera la propiedad del estado.
Véase también addState().
[signal] void QStateMachine::runningChanged(bool running)
Esta señal se emite cuando se cambia la propiedad en ejecución con running como argumento.
Nota: Señal notificadora para la propiedad running.
Véase también QStateMachine::running.
void QStateMachine::setAnimated(bool enabled)
Establece si las animaciones son enabled para esta máquina de estados.
Nota: Función Setter para la propiedad animated.
Ver también isAnimated().
void QStateMachine::setGlobalRestorePolicy(QState::RestorePolicy restorePolicy)
Establece la política de restauración de la máquina de estados en restorePolicy. La política de restauración por defecto es QState::DontRestoreProperties.
Nota: Función Setter para la propiedad globalRestorePolicy.
Véase también globalRestorePolicy().
[slot] void QStateMachine::start()
Inicia esta máquina de estados. La máquina restablecerá su configuración y pasará al estado inicial. Cuando se entra en un estado final de nivel superior (QFinalState), la máquina emitirá la señal finished().
Nota: Una máquina de estados no se ejecutará sin un bucle de eventos en ejecución, como el bucle de eventos de la aplicación principal iniciado con QCoreApplication::exec() o QApplication::exec().
Ver también started(), finished(), stop(), initialState(), y setRunning().
[private signal] void QStateMachine::started()
Esta señal se emite cuando la máquina de estado ha entrado en su estado inicial (QStateMachine::initialState).
Nota: Esta es una señal privada. Puede ser utilizada en conexiones de señales pero no puede ser emitida por el usuario.
Ver también QStateMachine::finished() y QStateMachine::start().
[slot] void QStateMachine::stop()
Detiene esta máquina de estados. La máquina de estado dejará de procesar eventos y emitirá la señal stopped().
Véase también stopped(), start(), y setRunning().
[private signal] void QStateMachine::stopped()
Esta señal se emite cuando la máquina de estados se ha detenido.
Nota: Se trata de una señal privada. Puede ser utilizada en conexiones de señales pero no puede ser emitida por el usuario.
Véase también QStateMachine::stop() y 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.