4.6がやってきた-Qt最新事情2010

第4回 ステートマシーンフレームワーク

この記事を読むのに必要な時間:およそ 5 分

はじめに

Qt 4.6で導入されたQtのステートマシーンフレームワークは,状態遷移による実行モデルをQtアプリケーションフレームワークで利用できるようにしています。Qtのメタオブジェクトシステムと密接に結びつけられて実装されいて,状態間の遷移はQtのシグナルやキーイベント,マウスイベントなどのイベントによって引き起されます。さらに,Qtのプロパティ(筆者が以前書いた特集記事「Qtの基本プログラミング~オブジェクトモデル」参照)を使って状態の規定もできます。

Qtのステートマシンフレームワークは,ハレルの状態遷移図を元とし,その実行動作はSCXML(State Chart XML)に基づいています。現時点で正式にリリースされているのは,今回説明するステートマシンフレームワークですが,この他の実装がQt LabsのProjects/xml/scxmlで試みられています。このプロジェクトでは,以下の3つの実装がなされています。

ステートチャートコンパイラ
SCXML記述をQtステートマシンフレームワークのC++コードに変換するコンパイラ(scc,State Chart Compiler)。
QtScript用(QScxmlを利用)
WebKitベースのブラウザ用
Qt Labs BlogsのページではQt Webkit, Arora, Safari, Chromeなどを使って,実際にデモを動かすことができます。

動画1 WebKitブラウザ用デモの模様

そしてさらに,こられの3実装で用いられるSCXMLをグラフィカルな状態遷移図として表示するQt Creatorプラグインの計画やこの連載の第1回「速報!Qt 4.6新機能とロードマップ」で触れたDeclarative UIのQMLとの併用も試みられています。

今回紹介するアニメーションプログラムのソースリストはこちらからダウンロードしてください。
examples.zip

ステートマシンフレームワークのクラス

図1は,ステートマシンフレームワークに用意されているクラスです。主要なクラスの機能概要は表1のようになります。

図1 ステートマシンフレームワークのクラス

図1 ステートマシンフレームワークのクラス

表1

クラス名機能概要
QStateMachineひとつの階層型有限状態機械。
QState状態機械中の状態で,初期状態のプロパティinitialStateや並列状態を区別するプロパティchildModeがあります。
QFinalState状態機械中の終了状態。
QHistoryState前の活性化された副状態への復帰に用いる。
QEventTransitionQtのイベント対するQObjectに特化した遷移で,QObjectのインタンスとイベントを束ねたオブジェクトです。
QKeyEventTransitionキーイベントによって引き起される遷移。
QMouseEventTransitionマウスイベントによって引き起される遷移。
QSignalTransitionQtのシグナルによって引き起される遷移。

アニメーションの書き換え

詳しい説明は次回に回し,前回の「アニメーションフレームワーク」の説明の最後の「パラレルアニメーションによるアニメーションの並行実行」のサンプルプログラムにアニメーションフレームワークを適用して書き換えてみましょう。

図2は,適用した状態遷移図です。

図2 サンプルプログラムanimatedtransitionの状態遷移図

図2 サンプルプログラムanimatedtransitionの状態遷移図

startState状態は,アニメーションの開始待ち状態を表します。図2の左の黒丸からの矢印は,この状態が初期状態であることを示しています。この状態をプロパティで以下のように規定しています。

  • ボタンのテキストに "Start" をセットする。
  • 3つのボタンの位置を (startX, y) にセットし,位置を左端にする。

endState状態は,アニメーションの完了状態を表します。状態機械の終了状態ではなく,アニメーションの終わりを示します(正確には,アニメーションが始まるとendStateに遷移しています)⁠この状態をプロパティで以下のように規定しています。

  • ボタンのテキストに"Reset"をセットする。
  • 3つのボタンの位置を (startX, y) にセットし,位置を左端にする。

movingBallTransition遷移は,startState状態にあるときにボタンがシグナルclicked()を送信することで引き起される遷移です。この遷移に,並列アニメーションを設定して,startState 状態でのボタンのクリックで,アニメーションが始まるようにします。

resetTransition遷移は,endState状態にあるときにボタンがシグナルclicked()を送信することで引き起されます。アニメーションの実行中には,endState状態になっているので,ボタンをクリックすれば,中断されてstartState 状態に戻って,アニメーションの開始待ち状態となります。

前回の説明で補足したように,書き換えると3つのボールを左端に戻すのを初期状態としてわかりやすく記述できます。

これを実行させた模様は次の動画のようになります。

動画2 書き換えたアニメーション

では,書き換えたサンプルコードの要点を変更箇所を中心に説明します。

著者プロフィール

杉田研治(すぎたけんじ)

1955年生まれ。東京都出身。株式会社SRAに勤務。プログラマ。

仕事のほとんどをMac OS XとKubuntu KDE 4でQtと供に過ごす。

コメント

コメントの記入