乒乓球国家
“乒乓球状态”示例演示了如何在Qt State Machine 框架中结合使用并行状态、自定义事件和状态转换。
本示例实现了一个状态图,其中两个状态通过向状态机发布事件进行通信。该状态图如下所示:

“pinger ”和“ponger ”是并行状态,即它们会同时进入,并且会独立地发生状态转换。
pinger 状态在进入时会发布第一个ping 事件;ponger 状态将通过发布pong 事件进行响应;这将导致pinger 状态发布新的ping 事件;以此类推。
class PingEvent : public QEvent
{
public:
PingEvent() : QEvent(PingEventType) { }
};
class PongEvent : public QEvent
{
public:
PongEvent() : QEvent(PongEventType) { }
};定义了两个自定义事件:PingEvent 和PongEvent 。
classPinger :publicQState
{
public:
explicitPinger(QState*parent) : QState(parent) { }
protected:
voidonEntry(QEvent*) override
{
machine()->postEvent(newPingEvent);
qInfo() << "ping?";
}
};Pinger 类定义了一种状态,当进入该状态时,会向状态机发送PingEvent 消息。
classPingTransition :publicQAbstractTransition
{
public:
PingTransition() {}
protected:
booleventTest(QEvent*e) override {return e->type()==PingEventType; }
voidonTransition(QEvent*) override
{
machine()->postDelayedEvent(newPongEvent, 500);
qInfo() << "pong!";
}
};PingTransition 类定义了一种由PingEvent 类型事件触发的状态转换,当该转换被触发时,会向状态机发送一个PongEvent (延迟500毫秒)。
classPongTransition :publicQAbstractTransition
{
public:
PongTransition() {}
protected:
booleventTest(QEvent*e) override {return(e->type()==PingEventType); }
voidonTransition(QEvent*) override
{
machine()->postDelayedEvent(newPingEvent, 500);
qInfo() << "ping?";
}
};PongTransition 类定义了一种由PongEvent 类型事件触发的过渡,当该过渡被触发时,会向状态机发送一个PingEvent (延迟 500 毫秒)。
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
QStateMachine machine;
auto group = new QState(QState::ParallelStates);
group->setObjectName("group");main() 函数首先创建一个状态机和一个并行状态组。
auto pinger = new Pinger(group);
pinger->setObjectName("pinger");
pinger->addTransition(new PongTransition);
auto ponger = new QState(group);
ponger->setObjectName("ponger");
ponger->addTransition(new PingTransition);接下来,创建了pinger 和ponger 这两个状态,并将并行状态组设为其父状态。 请注意,这些转换没有目标。当此类转换被触发时,源状态不会被退出并重新进入;只会调用该转换的 onTransition() 函数,而状态机的配置将保持不变,这正是本例中我们所期望的效果。
machine.addState(group);
machine.setInitialState(group);
machine.start();
return app.exec();
}最后,将该组添加到状态机中,启动状态机,并进入应用程序事件循环。
© 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.