핑퐁 주
'핑퐁 스테이트' 예제는 '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 라는 두 가지 사용자 정의 이벤트가 정의되어 있습니다.
class Pinger : public QState
{
public:
explicit Pinger(QState*parent) : QState(parent) { }
protected:
void onEntry(QEvent*) override
{
machine()->postEvent(new PingEvent);
qInfo() << "ping?";
}
};Pinger 클래스는 해당 상태에 진입할 때 상태 머신에 ` PingEvent `를 게시하는 상태를 정의합니다.
class 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!";
}
};PingTransition 클래스는 PingEvent 유형의 이벤트에 의해 트리거되는 전환을 정의하며, 전환이 트리거되면 500밀리초의 지연 시간을 두고 PongEvent 를 상태 머신에 게시합니다.
class 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?";
}
};PongTransition 클래스는 PongEvent 유형의 이벤트에 의해 트리거되는 전환을 정의하며, 전환이 트리거되면 500밀리초의 지연 시간을 두고 상태 머신에 PingEvent 를 전송합니다.
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.