Estados de Ping Pong
El ejemplo de Estados Ping Pong muestra cómo utilizar estados paralelos junto con eventos y transiciones personalizados en Qt State Machine Framework.
Este ejemplo implementa un diagrama de estados donde dos estados se comunican enviando eventos a la máquina de estados. El gráfico de estados tiene el siguiente aspecto:

Los estados pinger y ponger son estados paralelos, es decir, se introducen simultáneamente y tomarán transiciones independientemente uno del otro.
El estado pinger enviará el primer evento ping al entrar; el estado ponger responderá enviando un evento pong; esto hará que el estado pinger envíe un nuevo evento ping; y así sucesivamente.
class PingEvent : public QEvent { public: PingEvent() : QEvent(PingEventType) { } }; class PongEvent : public QEvent { public: PongEvent() : QEvent(PongEventType) { } };
Se definen dos eventos personalizados, PingEvent y PongEvent.
clase Pinger : public QState {public: explícito Pinger(QState *parent) : QState(padre) { }protected: void onEntry(QEvent *) override { machine()->postEvent(new PingEvent); qInfo() << "ping?"; } };
La clase Pinger define un estado que envía un PingEvent a la máquina de estados cuando se entra en el estado.
clase PingTransition : public QAbstractTransition {public: PingTransition() {}protected: bool eventTest(QEvent *e) override { return e->type() == PingEventType; } void onTransition(QEvent *) override { machine()->postDelayedEvent(new PongEvent, 500); qInfo() << "pong!"; } };
La clase PingTransition define una transición que se activa por eventos de tipo PingEvent, y que envía un PongEvent (con un retardo de 500 milisegundos) a la máquina de estados cuando se activa la transición.
clase PongTransition : public QAbstractTransition {public: PongTransition() {}protected: bool eventTest(QEvent * e) override { return (e->type() == PingEventType); } void onTransition(QEvent *) override { machine()->postDelayedEvent(new PingEvent, 500); qInfo() << "ping?"; } };
La clase PongTransition define una transición que se activa por eventos de tipo PongEvent, y que envía un PingEvent (con un retardo de 500 milisegundos) a la máquina de estados cuando se activa la transición.
int main(int argc, char **argv) { QCoreApplication app(argc, argv); QStateMachine machine; auto group = new QState(QState::ParallelStates); group->setObjectName("group");
La función main() comienza creando una máquina de estados y un grupo de estados paralelos.
auto pinger = new Pinger(group); pinger->setObjectName("pinger"); pinger->addTransition(new PongTransition); auto ponger = new QState(group); ponger->setObjectName("ponger"); ponger->addTransition(new PingTransition);
A continuación, se crean los estados pinger y ponger, con el grupo de estados paralelos como estado padre. Nótese que las transiciones no tienen objetivo. Cuando se dispara una transición de este tipo, no se saldrá del estado origen ni se volverá a entrar en él; sólo se llamará a la función onTransition() de la transición, y la configuración de la máquina de estados seguirá siendo la misma, que es precisamente lo que queremos en este caso.
machine.addState(group); machine.setInitialState(group); machine.start(); return app.exec(); }
Finalmente, se añade el grupo a la máquina de estados, se inicia la máquina y se entra en el bucle de eventos de la aplicación.
© 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.