ピンポン州

ピンポン・ステートの例では、Qt State Machine フレームワークでカスタム・イベントやトランジションとともにパラレル・ステートを使用する方法を示しています。

この例では、ステートマシンにイベントをポストすることで、2つのステートが通信するステートチャートを実装しています。ステートチャートは以下のようになります:

pingerponger のステートはパラレル・ステートであり、同時に入力され、互いに独立して遷移する。

pinger 、最初のping イベントをポストする。pongerpong イベントをポストして応答する。pinger 、新しいping イベントをポストする。

class PingEvent : public QEvent
{
public:
    PingEvent() : QEvent(PingEventType) { }
};

class PongEvent : public QEvent
{
public:
    PongEvent() : QEvent(PongEventType) { }
};

PingEventPongEvent の2つのカスタムイベントが定義されている。

classPinger :publicQState
{public:explicitPinger(QState*parent) : QState(parent) { }protected:voidonEntry(QEvent*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 ミリ秒の遅延)をステートマシンにポストします。

クラスPongTransition :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);

次に、パラレル・ステート・グループを親ステートとして、pingerponger ステートが作成される。遷移にはターゲットがないことに注意。このようなトランジションがトリガーされると、ソース・ステートが終了して再入力されることはない。トランジションのonTransition()関数だけが呼び出され、ステートマシンのコンフィギュレーションは変わらない。

    machine.addState(group);
    machine.setInitialState(group);
    machine.start();

    return app.exec();
}

最後に、ステートマシンにグループが追加され、マシンが開始され、アプリケーションのイベントループに入ります。

プロジェクト例 @ code.qt.io

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