ステートマシンは、ユーザーの操作を表すのに実際には正しい選択ではないと思います。これは、ユーザーインターフェイス自体の変更を簡単にモデル化するのに適しています。
おそらく必要なのは、ステートマシンとコマンドデザインパターンの組み合わせです。これは、QtではQUndoStackクラスとQUndoCommandクラスによって部分的に実装されています。ステートマシンはユーザーインターフェイス自体への変更を追跡し、コマンドクラスはユーザーの操作を追跡します。セルの境界線の検出についてはよくわかりません。また、アプリでインタラクションモデルをどのように計画しているかはわかりませんが、明確にするために、作り話の例を試してみましょう。
例
アプリに、ユーザーから提供された概算から開始してセルの境界を検出する2つの異なるアルゴリズムがあるとします。1つは、セルの周りの大まかなポイントごとのパスを取ります。もう1つはフリーハンドの輪郭を取ります。また、ユーザーがセル画像にコールアウトメモを追加できるようにする必要があります。また、ユーザーが現在使用しないツールでユーザーの画面を乱雑にしたくないとします。
次に、3つの異なる対話モードがあり、それぞれにユーザーが使用できる異なるアクション(またはツール)があります。
- ポイントごとに。ユーザーは、ポイントの追加、ポイントの削除、ポイントの移動、ポイントの選択、および境界線の調整を行うことができます。
- フリーハンド。ユーザーは「鉛筆」と「消しゴム」で描画し、境界線を洗練することができます。
- コールアウトノート。ユーザーは、メモの追加、メモの削除、メモの移動、メモの矢印の再配置、およびメモのテキストの編集を行うことができます。
ツールを提供することに加えて、最初の2つのモードでは、ユーザーがアルゴリズムのパラメーターを調整できる場合もあります。
アプローチは、1、2、および3のそれぞれをステートマシンの状態として表すことです。状態の1つに入ると、ツールが表示されます。状態が終了すると、ツールが非表示になります。状態の変更は、たとえばツールバーボタンを使用して実行できます。
これで、ツールを使用してその下のモデルを変更すると、QUndoCommandもQUndoStackに格納されます。ユーザーがフリーハンドモードになっているとします。ここで、彼女はポイントツーポイントモードに切り替え、パラメーターを微調整し、2つのポイントを追加し、ポイントを移動してから、それを削除します。UNDOスタックは、下から上に次のようになります。
- フリーハンドモードからポイントツーポイントモードに切り替えます
- パラメータεを0.00001から0.002に変更します
- (120、40)にポイント#1を追加
- (403、11)にポイント#2を追加
- ポイント#1を(120、40)から(350、120)に移動します
- ポイント#1を削除
状態の変更が取り消しスタックに追加されたため、一連のコマンドを元に戻すと、ユーザーはそれを発行したときの場所に正確にとどまることに注意してください。たとえば、彼女が1まで戻っていない場合、彼女はフリーハンドモードに戻ります。
まとめると
- Qtのステートマシンは、ユーザーインターフェイスの変更を追跡するのに適しています。
- コマンドデザインパターンは、基になるモデルでユーザーが行った変更を追跡するのに適しています。