このページでは

QtのUndoフレームワークの概要

はじめに

QtのUndoフレームワークは、アプリケーションに元に戻す/やり直し機能を実装するための、コマンドパターンの実装です。

コマンドパターンは、アプリケーション内のすべての編集がコマンドオブジェクトのインスタンスを作成することによって行われるという考え方に基づいています。コマンドオブジェクトはドキュメントに変更を適用し、コマンドスタックに格納されます。さらに、各コマンドは、ドキュメントを以前の状態に戻すために、その変更を元に戻す方法を知っています。 アプリケーションがドキュメントの状態を変更するためにコマンドオブジェクトのみを使用している限り、スタックを下方向に辿り、各コマンドに対して順番に undo を呼び出すことで、一連のコマンドを元に戻すことができます。また、スタックを上方向に辿り、各コマンドに対して redo を呼び出すことで、一連のコマンドをやり直すことも可能です。

クラス

このフレームワークは4つのクラスで構成されています:

  • QUndoCommand は、アンドゥスタックに格納されるすべてのコマンドの基底クラスです。ドキュメントに対する単一の変更を適用(リドゥ)または元に戻すことができます。
  • QUndoStack は、QUndoCommand オブジェクトのリストです。ドキュメントに対して実行されたすべてのコマンドを含んでおり、それらを元に戻す(undo)またはやり直す(redo)ことで、ドキュメントの状態を過去または未来へと移動させることができます。
  • QUndoGroup は、アンドゥスタックのグループです。 これは、アプリケーションに複数のアンドゥスタック(通常は開いているドキュメントごとに1つずつ)が含まれている場合に役立ちます。QUndoGroup は、グループ内のすべてのスタックに対して1組のアンドゥ/リドゥスロットを提供します。これは、アンドゥおよびリドゥのリクエストをアクティブなスタック(ユーザーが現在編集中のドキュメントに関連付けられたスタック)に転送します。
  • QUndoView は、元に戻すスタックの内容を表示するウィジェットです。ビュー内のコマンドをクリックすると、ドキュメントの状態がそのコマンドの位置まで前後に移動します。

概念

このフレームワークでは、以下の概念がサポートされています:

  • クリーン状態:ドキュメントがディスクに保存された状態に入ったり、その状態から抜け出したりしたことを通知するために使用されます。これは通常、保存操作の有効化・無効化や、ドキュメントのタイトルバーの更新に使用されます。
  • コマンドの圧縮:一連のコマンドを単一のコマンドに圧縮するために使用されます。例えば、テキストエディタでは、ドキュメントに個々の文字を挿入するコマンドを、テキストのセクション全体を挿入する単一のコマンドに圧縮できます。このような大きな変更は、ユーザーが元に戻したりやり直したりする際に便利です。
  • コマンドマクロ:一連のコマンドであり、これらすべてを1つのステップで元に戻したりやり直したりできます。これにより、より単純なコマンドのセットを組み合わせてより複雑なコマンドを作成できるため、アプリケーション開発の作業が簡素化されます。 たとえば、ドキュメント内で選択された一連のオブジェクトを移動するコマンドは、それぞれが単一のオブジェクトを移動する一連のコマンドを組み合わせることで作成できます。

QUndoStack は、メニューやツールバーに挿入できる便利な「元に戻す」および「やり直し」QAction オブジェクトを提供します。これらのアクションのテキストプロパティは、トリガーされた際にどのコマンドが元に戻されるか、あるいはやり直されるかを常に反映しています。同様に、QUndoGroup は、アクティブなスタックの「元に戻す」および「やり直し」アクションと常に同じように動作する「元に戻す」および「やり直し」アクションを提供します。

© 2026 The Qt Company Ltd. 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.