このページでは

SCXMLエディタ

状態図は、システムが刺激に対してどのように反応するかをモデル化するグラフィカルな方法です。状態図は、システムがどのような状態になりうるか、また、ある状態から別の状態への遷移(状態間の遷移)をどのように行うかを定義します。イベント駆動型システム(Qt アプリケーションなど)の動作は、最後のイベントや現在のイベントだけでなく、それ以前のイベントにも依存することがよくあります。状態グラフを使えば、この情報を簡単に共有することができます。

Qt Creator ファイルウィザードを使用すると、ボイラープレートコードを含むステートチャート XML (SCXML)ファイルをプロジェクトに追加することができます。SCXML エディタを使用してステート・チャートを編集し、ファイルにステートとトランジションを追加します。その後、Qt SCXML モジュールのクラスを使用して、ファイルから作成したステートマシンを Qt アプリケーションに組み込みます。

.scxml ファイルを開くと、SCXML エディタが開きます:

SCXMLエディタ

Common States ビュー(1)からステートエディタ(2)にステートをドラッグします。ステートエディタで状態を選択し、ツールボタン(3)を使って遷移(4)とそのターゲット状態を作成します。

Structure ビュー(5)でステート・チャートの構造を表示し、Attributes ビュー(6)で選択した状態または遷移の属性を指定します。

ツールバーのボタンを使用して、状態図の編集、ズーム、拡大、ナビゲート、パン、およびスクリーンショットの撮影や統計の表示などの機能を実行します。

ボタンボタン名説明
スクリーンショットの保存Save Screenshot状態図の現在表示されている部分を画像として保存します。
キャンバスを画像にエクスポートExport Canvas to Image州グラフ全体を画像として保存します。
ズームイン

ズームアウト

Zoom In

Zoom Out

ステート・エディタのステート・チャート全体をズーム・インまたはズーム・アウトします。

Ctrlを選択してマウスホイールを使うこともできます。

パニングPanning州図をパンします。パンする速度を上げるには、Shiftを選択します。
ビューにフィットFit to View一度に状態エディタで状態図全体を表示します。
拡大鏡ツールMagnifier Tool状態図の一部を拡大表示します。拡大鏡ツールをより速く動かすには、Altを選択したままにします。
ナビゲーターNavigatorステートエディタで大きなステートチャートの特定の部分を表示します。ナビゲータ枠を表示したい部分に移動します。
統計を見るView Statistics状態図の状態数と遷移数の統計を表示します。

ステートチャート内を検索するには、Search を選択し、Filter フィールドに入力を開始します。検索は、SCXML ツリー全体で検索条件に一致する属性をチェックします。

状態

イベントに応じてステートマシンが状態に入ると、その状態がアクティブ状態になります。

ステート・チャートは階層的であるため、他のステートの中にステートをネストして複合ステートを作成することができます。

以下のタイプの状態を作成できます:

ボタン名前説明
初期状態Initialステートマシンの起動時に入る状態。
基本状態State基本状態。
パラレルステートParallel並行して実行され、すべて同時にアクティブになる子状態を持つ。それぞれの子状態は独立してイベントを処理し、イベントはそれぞれの子状態で異なる遷移を引き起こす可能性がある。
最終状態Finalステートマシンを終了させる。ステートマシンがトップレベルの最終状態に入ると、終了シグナルを発して停止する。複合状態の内部詳細を隠すために、複合状態の中に最終状態を作成できます。外部は、ステートに入り、ステートが終了したときに通知を受け取ることができるだけです。並列ステートは、すべての子ステートが最終ステートに達すると終了する。
歴史History擬似ステートとは、親ステートが最後に終了したときにその親ステートが持っていた子ステートを表すものである。

現在の子状態を記録したい状態の子として、履歴状態を作成します。実行時にステートマシンがこのような状態の存在を検出すると、親状態が終了したときに、現在の(実際の)子状態が自動的に記録されます。履歴状態への遷移は、実際には、ステートマシンが以前に保存した子状態への遷移である。ステートマシンは、実子状態への遷移を自動的に転送する。

状態間の遷移を作成するには、トランジション を選択します。

状態の追加

ステート・チャートに新しいステートを追加するには、以下の方法があります:

  • Common States ビューからステートエディタにステートをドラッグする。
  • ステートエディタで状態を選択し、State ツールボタンを選択して遷移とそのターゲット状態を作成する。
  • SCXMLエディタ内、またはSCXMLエディタとEdit モード間で、ステートをコピー&ペーストする。

他のステートの上にステートをドラッグして、複合ステートを作成します。子ステートを親ステートからドラッグすることもできます。子ステートを親ステートから移動するには、Ctrlを押しながらドラッグします。

状態の整列と編集

ステート・エディターでステートを整列させたり、サイズ、色、フォントを調整したり、デフォルトの配色を変更するには、ツールバーのボタンを使用します。

状態を編集するためのボタン

重なっている状態は、赤色でマークされます。

ステートツリー構造の表示

Structure ビューでステート ツリー構造を展開または折りたたむには、ステートをダブルクリックします。

状態エディタで、入れ子になった状態の子状態の詳細を表示するには、Zoom to State を選択します。

複合ステートマシン内で状態IDが一意になるようにするには、フルネームスペースの切り替え (Toggle Full Namespace) を選択します。親状態の名前は、2つのコロン(::)で区切られた子状態の名前に追加されます。例えば

<state id="broken">
...
    <state id="broken::blinking">
    ...
    </state>
    <state id="broken::unblinking">
    ...
    </state>
</state>

トランジションの管理

トランジションは、ステートマシンまたは外部エンティティが生成するイベントに対する状態の反応を定義します。イベントが発生すると、ステートマシンはアクティブなステートで一致する遷移をチェックし、ターゲット・ステートに移動します。

選択した状態から新しい状態への遷移を作成するには、ターゲット状態を追加したい場所でマウスをドラッグして離します。他の状態の中心にトランジションを描くと、そのトランジションは状態の中心を指しますが、状態の端にトランジションを描くこともできます。

エディタは遷移ラベルを中央に配置しますが、他の位置にドラッグすることもできます。

トランジションの条件は、角括弧([])内のトランジション線の下に表示されます。

トランジションにエッジポイントを追加するには、トランジションラインを選択します。各行に追加できるエッジポイントは2つだけです。エディターは不要なエッジポイントを自動的に削除します。選択したエッジポイントを削除するには、コンテキストメニューからRemove Point を選択します。

マウスクリックで新しいエッジポイントを追加するには、トランジション を選択します。

選択したトランジションを削除するには、コンテキストメニューからRemove を選択します。

実行可能コンテンツの追加

状態図に実行可能コンテンツを追加して、状態マシンがデータモデルを変更したり、外部エンティティと相互作用できるようにします。

コンテキスト・メニューのコマンドを使用して、実行可能コンテンツを<onentry> および<onexit> 要素またはトランジションに追加します:

  • <raise> イベントを発生させる
  • <send> 外部エンティティとの通信
  • <script> スクリプトを実行する
  • <assign> データモデルを変更する
  • <cancel> アクションの実行をキャンセルする
  • <log> ログに情報を記録する
  • <if> 条件付きでアクションを実行する
  • <foreach> コレクション内のアイテムを繰り返し、それぞれのアイテムに対してアクションを実行する

遷移の間、ステートマシンは、<onexit> 要素が離脱する状態で指定したコンテンツを実行し、次に遷移内のコンテンツを実行し、次に<onentry> 要素が入力する状態で指定したコンテンツを実行します。

Attributes ビューで、選択した実行コンテンツに属性を追加できます。

状態図の作成」も参照してください

Copyright © The Qt Company Ltd. and other contributors. 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.