SCXML状態図の編集
ステートチャートは、システムが刺激にどのように反応するかをグラフィカルにモデル化する手法です。これらは、システムが取り得る状態と、システムがある状態から別の状態へどのように移行するか(状態間の遷移)を定義します。 イベント駆動型システム(Qtアプリケーションなど)の挙動は、多くの場合、直近または現在のイベントだけでなく、それ以前のイベントにも依存します。ステートチャートを使用することで、この情報を簡単に共有できます。
「Qt Creator 」ファイルウィザードを使用すると、定型コードを含むState Chart XML(SCXML)ファイルをプロジェクトに追加できます。SCXMLエディタでステートチャートを編集し、ファイルに状態や遷移を追加します。その後、Qt SCXML モジュールのクラスを使用して、ファイルから作成されたステートマシンをQtアプリケーションに組み込みます。
.scxml ファイルを開くと、SCXML エディタで表示されます。

「Common States 」ビュー (1) から「state editor」 (2) へ状態をドラッグします。「state editor」で状態を選択し、ツールボタン (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 | ステートマシンを終了させます。ステートマシンが最上位の最終状態に入ると、finished シグナルを発生させて停止します。複合状態内で最終状態を作成することで、複合状態の内部の詳細を隠蔽することができます。外部からは、その状態に入ることはできますが、状態が終了したときにのみ通知を受け取ることができます。 並列状態は、そのすべての子状態が最終状態に達したときに終了します。 |
![]() | 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.












