<QSignalTransition>10~12行で,ステートマシンフレームワークのシグナルトランジションを使用するために必要なヘッダファイルをインクルードしています。QPushButton()としても良いのですが,レイアウト時にサイズが決められるようにすることでフリッカーを避けられるので,あらかじめセットするようにします。);状態遷移機械のインスタンスで,以降でこれに対して状態や遷移を定義します。);アニメーションの開始待ちを表すstartState状態のインスタンスです。メソッドassignProperty()でこの状態になったときに,オブジェクト(QObjectのサブクラスのオブジェクト)のposプロパティに設定する値を指定しています。設定値は,ボールが左端にあるときの位置です。初期状態の設定をします。初期状態は必ず指定する必要があり,忘れた場合には実行時に警告メッセージがコンソールに表示されます。);アニメーションの完了状態を表すendState状態のインスタンスで,ボールが右端にあるときの位置を指定しています。このように,どの状態のときにどのようなプロパティを宣言的に規定することで,どのようになっていて欲しいかを明示的に表記できるのがステートマシンフレームワークの利点のひとつです。);startState状態にあるときに,ボタンがシグナルclicked()を送信するとendState状態に遷移するシグナルトランジションのインスタンスです。addAnimation()でアニメーションをセットするとボタンのクリックで,アニメーションが始まります。クリックの瞬間に指定した状態に移るのであって,アニメーションの完了によって状態が移るのではないことに注意が必要です。);逆に,endState状態にあるときにボタンがシグナルclicked()を送信すると,startState状態に戻るシグナルトランジションのインスタンスです。endState状態は,見かけ上はアニメーションの動作中か,3つのボールがすべて右端にあるときの状態です。}状態遷移機械によって動作が規定されてるので,ボタンのクリックで呼出されるHarness::startAnimation()スロットは不要です。スロットでボールを左端に戻す必要もなく,アニメーションを開始させるような実行コードは明示的には書きません。いったことは,状態遷移機械stateMachineで宣言的に表明しているからです。おわりにQtのステートマシンフレームワークの概要とその実際の適用例について説明しました。簡単な例ですが,状態遷移機械で動作を規定すると検証し易いコードにもなることがわかります。次回は,各クラスの詳細や独自のシグナルトランジションやイベントトランジションの作成方法について説明する予定です。