QUndoStack Class
QUndoStack クラスは、QUndoCommand オブジェクトのスタックです。詳細...
| ヘッダー: | #include <QUndoStack> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
| qmake: | QT += gui |
| 継承元: | QObject |
プロパティ
パブリック関数
| QUndoStack(QObject *parent = nullptr) | |
| virtual | ~QUndoStack() |
| void | beginMacro(const QString &text) |
| bool | canRedo() const |
| bool | canUndo() const |
| int | cleanIndex() const |
| void | clear() |
| const QUndoCommand * | command(int index) const |
| int | count() const |
| QAction * | createRedoAction(QObject *parent, const QString &prefix = QString()) const |
| QAction * | createUndoAction(QObject *parent, const QString &prefix = QString()) const |
| void | endMacro() |
| int | index() const |
| bool | isActive() const |
| bool | isClean() const |
| void | push(QUndoCommand *cmd) |
| QString | redoText() const |
| void | setUndoLimit(int limit) |
| QString | text(int idx) const |
| int | undoLimit() const |
| QString | undoText() const |
パブリックスロット
| void | redo() |
| void | resetClean() |
| void | setActive(bool active = true) |
| void | setClean() |
| void | setIndex(int idx) |
| void | undo() |
シグナル
| void | canRedoChanged(bool canRedo) |
| void | canUndoChanged(bool canUndo) |
| void | cleanChanged(bool clean) |
| void | indexChanged(int idx) |
| void | redoTextChanged(const QString &redoText) |
| void | undoTextChanged(const QString &undoText) |
詳細な説明
Qt の Undo フレームワークの概要については、概要ドキュメントを参照してください。
アンドゥ・スタックは、ドキュメントに適用されたコマンドのスタックを管理します。
新しいコマンドは、push() を使用してスタックにプッシュされます。コマンドは、undo() およびredo() を使用するか、createUndoAction() およびcreateRedoAction() によって返されるアクションをトリガーすることで、元に戻したりやり直したりすることができます。
QUndoStackは、current コマンドを追跡します。これは、次にredo()が呼び出された際に実行されるコマンドです。このコマンドのインデックスは、index()によって返されます。 編集対象オブジェクトの状態は、setIndex() を使用して前へまたは後ろへ巻き戻すことができます。スタックの最上部のコマンドがすでに再実行されている場合、index() の値はcount() と等しくなります。
QUndoStack は、元に戻す(undo)およびやり直し(redo)操作、コマンドの圧縮、コマンドマクロをサポートしており、クリーン状態の概念もサポートしています。
元に戻すおよびやり直し操作
QUndoStack は、メニューやツールバーに挿入できる便利な元に戻すおよびやり直し用の `QAction ` オブジェクトを提供します。コマンドが元に戻されたりやり直されたりすると、QUndoStack はこれらのアクションのテキストプロパティを更新し、どのような変更が引き起こされるかを反映させます。 また、元に戻すまたはやり直すためのコマンドがない場合、これらのアクションは無効化されます。これらのアクションは、QUndoStack::createUndoAction() およびQUndoStack::createRedoAction() によって返されます。
コマンドの圧縮とマクロ
コマンドの圧縮は、複数のコマンドを 1 つのコマンドに圧縮し、1 回の操作で元に戻したりやり直したりできる場合に役立ちます。たとえば、ユーザーがテキストエディタで文字を入力すると、新しいコマンドが作成されます。このコマンドは、カーソル位置にその文字を文書に挿入します。 しかし、単語全体、文、あるいは段落単位での入力操作を元に戻したりやり直したりできる方が、ユーザーにとってはより便利です。コマンドの圧縮により、こうした1文字単位のコマンドを統合し、テキストの区間を挿入または削除する単一のコマンドにまとめることが可能になります。詳細については、QUndoCommand::mergeWith() およびpush() を参照してください。
コマンドマクロとは、一連のコマンドのことであり、そのすべてが一度に元に戻されたり、やり直されたりします。コマンドマクロは、コマンドに子コマンドのリストを指定することで作成されます。 親コマンドを元に戻したりやり直したりすると、子コマンドも同様に元に戻されたりやり直されたりします。コマンドマクロは、QUndoCommand コンストラクタで親を指定するか、便利関数beginMacro() およびendMacro() を使用することで明示的に作成できます。
コマンドの圧縮とマクロは、ユーザーにとっては同じ効果を持つように見えますが、アプリケーション内での用途はしばしば異なります。ドキュメントに小さな変更を加えるコマンドは、それらを個別に記録する必要がなく、ユーザーにとって重要なのは大規模な変更のみである場合、圧縮すると便利です。 一方、個別に記録する必要があるコマンドや、圧縮できないコマンドについては、各コマンドの記録を維持しつつ、より便利なユーザー体験を提供するためにマクロを使用することが有用です。
クリーン状態
QUndoStackは「クリーン状態」という概念をサポートしています。ドキュメントがディスクに保存される際、setClean() を使用してスタックをクリーン状態としてマークすることができます。 スタックが、元に戻すややり直しコマンドを通じてこの状態に戻るたびに、cleanChanged() シグナルが発信されます。このシグナルは、スタックがクリーン状態を離れる際にも発信されます。このシグナルは通常、アプリケーション内の保存アクションを有効または無効にしたり、未保存の変更が含まれていることを反映してドキュメントのタイトルを更新したりするために使用されます。
廃止されたコマンド
QUndoStack は、コマンドが不要になった場合に、スタックからそのコマンドを削除することができます。一例として、2 つのコマンドが統合され、統合後のコマンドに機能がない場合などが挙げられます。これは、ユーザーがマウスを画面のある位置に移動させた後、元の位置に戻すような移動コマンドで見られます。 結合されたコマンドの結果、マウスの移動量は 0 になります。このコマンドは目的を果たさないため、削除することができます。もう一つの例は、接続の問題により失敗したネットワークコマンドです。この場合、接続の問題があったため、redo() およびundo() 関数が機能しないことから、そのコマンドをスタックから削除する必要があります。
コマンドは、QUndoCommand::setObsolete() 関数を使用して「廃止済み」としてマークできます。QUndoCommand::isObsolete() フラグは、適用可能な場合、QUndoCommand::undo()、QUndoCommand::redo()、およびQUndoCommand:mergeWith() を呼び出した後、QUndoStack::push()、QUndoStack::undo()、QUndoStack::redo()、およびQUndoStack::setIndex() でチェックされます。
コマンドが廃止済みとして設定されており、クリーンインデックスが現在のコマンドインデックス以上である場合、そのコマンドがスタックから削除されると、クリーンインデックスはリセットされます。
QUndoCommand およびQUndoViewも参照してください 。
プロパティのドキュメント
active : bool
このプロパティは、このスタックのアクティブ状態を保持します。
アプリケーションでは、開いているドキュメントごとに1つずつ、複数のアンドゥスタックが存在することがよくあります。アクティブなスタックとは、現在アクティブなドキュメントに関連付けられているスタックのことです。スタックがQUndoGroup に属している場合、QUndoGroup::undo()またはQUndoGroup::redo()への呼び出しは、このスタックがアクティブなときにこのスタックに転送されます。QUndoGroup がQUndoView によって監視されている場合、そのスタックがアクティブなときは、ビューにスタックの内容が表示されます。スタックがQUndoGroup に属していない場合、そのスタックをアクティブにしても何の効果もありません。
どのスタックをアクティブにするかは、通常、関連するドキュメントウィンドウがフォーカスを受けた際に setActive() を呼び出すことで、プログラマが指定する責任があります。
アクセス関数:
| bool | isActive() const |
| void | setActive(bool active = true) |
QUndoGroupも参照してください 。
[read-only] canRedo : bool
このプロパティは、このスタックでやり直しが可能かどうかを示します。
このプロパティは、やり直し可能なコマンドが存在するかどうかを示します。
アクセス関数:
| bool | canRedo() const |
通知シグナル:
| void | canRedoChanged(bool canRedo) |
関連項目: ` canRedo()`、`index()`、および `canUndo()`。
[read-only] canUndo : bool
このプロパティは、このスタックで元に戻す操作が可能かどうかを示します。
このプロパティは、元に戻せるコマンドがあるかどうかを示します。
アクセス関数:
| bool | canUndo() const |
通知シグナル:
| void | canUndoChanged(bool canUndo) |
関連項目: canUndo()、index()、およびcanRedo()。
[read-only] clean : bool
このプロパティは、このスタックのクリーン状態を保持します。
このプロパティは、スタックがクリーンであるかどうかを示します。たとえば、ドキュメントが保存された場合、スタックはクリーンな状態になります。
アクセス関数:
| bool | isClean() const |
通知シグナル:
| void | cleanChanged(bool clean) |
関連項目: isClean()、setClean()、resetClean()、およびcleanIndex()。
[read-only] redoText : QString
このプロパティには、次に「やり直し」処理が行われるコマンドのテキストが格納されます。
このプロパティには、redo() が次に呼び出された際にリドゥされるコマンドのテキストが格納されます。
アクセス関数:
| QString | redoText() const |
通知シグナル:
| void | redoTextChanged(const QString &redoText) |
関連項目: redoText()、QUndoCommand::actionText()、およびundoText()。
undoLimit : int
このプロパティは、このスタックに格納できるコマンドの最大数を指定します。
スタック上のコマンド数がそのスタックの undoLimit を超えると、スタックの末尾からコマンドが削除されます。マクロコマンド(子コマンドを持つコマンド)は 1 つのコマンドとして扱われます。デフォルト値は 0 で、これは制限がないことを意味します。
このプロパティは、アンドゥスタックが空の場合にのみ設定できます。スタックにコマンドが残っている状態で設定すると、現在のインデックスにあるコマンドが削除される可能性があるためです。スタックにコマンドが残っている状態で setUndoLimit() を呼び出すと、警告が表示されるだけで何も実行されません。
アクセス関数:
| int | undoLimit() const |
| void | setUndoLimit(int limit) |
[read-only] undoText : QString
このプロパティには、次に元に戻されるコマンドのテキストが格納されます。
このプロパティには、undo() が次に呼び出された際に元に戻されるコマンドのテキストが格納されます。
アクセス関数:
| QString | undoText() const |
通知シグナル:
| void | undoTextChanged(const QString &undoText) |
関連項目: undoText()、QUndoCommand::actionText()、およびredoText()。
メンバ関数のドキュメント
[explicit] QUndoStack::QUndoStack(QObject *parent = nullptr)
親のparent を持つ、空の取り消しスタックを作成します。スタックは初期状態ではクリーンな状態になります。parent がQUndoGroup オブジェクトである場合、スタックは自動的にそのグループに追加されます。
push()も参照してください 。
[virtual noexcept] QUndoStack::~QUndoStack()
元に戻すスタックを破棄し、そこに含まれているコマンドをすべて削除します。スタックが「QUndoGroup 」内にある場合、そのスタックは自動的にグループから削除されます。
「QUndoStack()」も参照してください 。
void QUndoStack::beginMacro(const QString &text)
指定されたtext 記述に基づくマクロコマンドの作成を開始します。
指定されたtext で記述された空のコマンドがスタックにプッシュされます。その後スタックにプッシュされるコマンドは、endMacro()が呼び出されるまで、その空のコマンドの子として追加されます。
beginMacro() およびendMacro() の呼び出しはネスト可能ですが、beginMacro() を呼び出すたびに、対応するendMacro() の呼び出しが必要です。
マクロの構成中は、スタックが無効化されます。つまり、
- indexChanged() およびcleanChanged() は発行されず、
- canUndo() およびcanRedo() は false を返します。
- undo() またはredo() を呼び出しても何の効果もありません。
- 元に戻す/やり直し操作が無効になります。
最外側のマクロに対してendMacro()が呼び出されると、スタックが有効になり、適切なシグナルが発行されます。
stack.beginMacro("insert red text");
stack.push(new InsertText(document, idx, text));
stack.push(new SetColor(document, idx, text.length(), Qt::red));
stack.endMacro(); // indexChanged() is emittedこのコードは以下と同等です:
QUndoCommand *insertRed = new QUndoCommand(); // an empty command
insertRed->setText("insert red text");
new InsertText(document, idx, text, insertRed); // becomes child of insertRed
new SetColor(document, idx, text.length(), Qt::red, insertRed);
stack.push(insertRed);endMacro()も参照してください 。
bool QUndoStack::canRedo() const
やり直し可能なコマンドがある場合はtrue を返し、そうでない場合はfalse を返します。
この関数は、スタックが空の場合、またはスタックの先頭にあるコマンドがすでにやり直されている場合に、false を返します。
注: プロパティ canRedoのゲッター 関数です。
関連項目: ` index()` および `canUndo()`。
[signal] void QUndoStack::canRedoChanged(bool canRedo)
このシグナルは、canRedo() の値が変更されるたびに発火します。これは、createRedoAction() によって返されるリドゥ操作を有効または無効にするために使用されます。canRedo は新しい値を指定します。
注: プロパティ `canRedo`の通知 シグナルです。
bool QUndoStack::canUndo() const
元に戻せるコマンドが存在する場合は `true ` を返し、そうでない場合は `false` を返します。
この関数は、スタックが空の場合、またはスタックの最下位のコマンドがすでに取り消されている場合に、false を返します。
index() == 0 と同義です。
注: プロパティ canUndoのゲッター 関数です。
[signal] void QUndoStack::canUndoChanged(bool canUndo)
このシグナルは、canUndo() の値が変化するたびに発火します。これは、createUndoAction() によって返される元に戻す操作を有効または無効にするために使用されます。canUndo は新しい値を指定します。
注: プロパティ `canUndo`の通知 シグナルです。
[signal] void QUndoStack::cleanChanged(bool clean)
このシグナルは、スタックがクリーン状態に入るか、またはクリーン状態を離れるたびに発せられます。clean がtrueの場合、スタックはクリーン状態にあります。そうでない場合、このシグナルはスタックがクリーン状態を離れたことを示します。
注: プロパティ `clean` に対する通知 シグナルです。
関連項目: isClean() およびsetClean()。
int QUndoStack::cleanIndex() const
クリーンインデックスを返します。これは、setClean() が呼び出されたインデックスです。
スタックにはクリーンインデックスが存在しない場合があります。これは、ドキュメントを保存した後、いくつかのコマンドを元に戻し、さらに新しいコマンドをスタックにプッシュした場合に発生します。push() は、新しいコマンドをプッシュする前に元に戻されたすべてのコマンドを削除するため、スタックは再びクリーンな状態に戻ることができません。 この場合、この関数は -1 を返します。また、resetClean() を明示的に呼び出した後にも -1 が返されることがあります。
isClean() およびsetClean()も参照してください 。
void QUndoStack::clear()
コマンドスタック上のすべてのコマンドを削除してスタックをクリアし、スタックを初期状態に戻します。
コマンドの取り消しややり直しは行われず、編集対象の状態は変更されません。
この関数は通常、ドキュメントの内容が破棄される場合に使用されます。
QUndoStack()も参照してください 。
const QUndoCommand *QUndoStack::command(int index) const
index にあるコマンドへの const ポインタを返します。
この関数が const ポインタを返すのは、コマンドがスタックにプッシュされて実行された後、そのコマンドを修正すると、後でそのコマンドを元に戻したりやり直したりした際に、ほぼ必ずドキュメントの状態が破損してしまうためです。
QUndoCommand::child()も参照してください 。
int QUndoStack::count() const
スタック上のコマンドの数を返します。マクロコマンドは1つのコマンドとしてカウントされます。
index()、setIndex()、およびcommand()も参照してください 。
QAction *QUndoStack::createRedoAction(QObject *parent, const QString &prefix = QString()) const
指定されたparent を持つ、再実行可能なQAction オブジェクトを作成します。
このアクションをトリガーすると、redo() が呼び出されます。このアクションのテキストは、次にredo() が呼び出された際にやり直されるコマンドのテキストであり、その先頭に指定されたprefix が付加されます。やり直し可能なコマンドがない場合、このアクションは無効になります。
prefix が空の場合、プレフィックスの代わりにデフォルトのテンプレート「Redo %1」が使用されます。Qt XML 4.8 以前では、デフォルトで「Redo」というプレフィックスが使用されていました。
createUndoAction()、canRedo()、およびQUndoCommand::text()も参照してください 。
QAction *QUndoStack::createUndoAction(QObject *parent, const QString &prefix = QString()) const
指定されたparent を持つ、QAction オブジェクトを作成します。
このアクションがトリガーされると、undo() が呼び出されます。このアクションのテキストは、次にundo() が呼び出された際に元に戻されるコマンドのテキストに、指定されたprefix が接頭辞として付加されたものです。元に戻す対象となるコマンドが存在しない場合、このアクションは無効になります。
prefix が空の場合、prefix の代わりにデフォルトのテンプレート「Undo %1」が使用されます。Qt XML 4.8 以前では、デフォルトで「Undo」という接頭辞が使用されていました。
createRedoAction()、canUndo()、およびQUndoCommand::text()も参照してください 。
void QUndoStack::endMacro()
マクロコマンドの構成を終了します。
ネストされたマクロ群の中でこれが最外側のマクロである場合、この関数はマクロコマンド全体に対して一度だけ `indexChanged()` を発行します。
beginMacro()も参照してください 。
int QUndoStack::index() const
現在のコマンドのインデックスを返します。これは、次にredo() が呼び出された際に実行されるコマンドです。いくつかのコマンドが取り消されている可能性があるため、必ずしもスタックの最上位にあるコマンドとは限りません。
setIndex()、undo()、redo()、およびcount()も参照してください 。
[signal] void QUndoStack::indexChanged(int idx)
このシグナルは、コマンドによってドキュメントの状態が変更されるたびに発火します。これは、コマンドの取り消しややり直しが行われた際に発生します。マクロコマンドの取り消しややり直しが行われた場合、あるいはsetIndex()が呼び出された場合、このシグナルは1回だけ発火します。
idx 現在のコマンド、すなわち次にredo() が呼び出された際に実行されるコマンドのインデックスを指定します。
index() およびsetIndex()も参照してください 。
bool QUndoStack::isClean() const
スタックがクリーンな状態の場合は `true` を返し、そうでない場合は `false` を返します。
注: プロパティ `clean`のゲッター 関数です。
関連項目: setClean() およびcleanIndex()。
void QUndoStack::push(QUndoCommand *cmd)
cmd をスタックにプッシュするか、直近で実行されたコマンドとマージします。いずれの場合も、cmd のredo()関数を呼び出して実行します。
cmd のidが-1ではなく、かつそのidが直近で実行されたコマンドのidと同一である場合、QUndoStack は、直近で実行されたコマンドに対してQUndoCommand::mergeWith()を呼び出すことで、2つのコマンドのマージを試みます。QUndoCommand::mergeWith()がtrue を返した場合、cmd は削除されます。
QUndoCommand::redo() および、該当する場合はQUndoCommand::mergeWith() を呼び出した後、cmd またはマージされたコマンドに対してQUndoCommand::isObsolete() が呼び出されます。QUndoCommand::isObsolete() がtrue を返した場合、cmd またはマージされたコマンドがスタックから削除されます。
それ以外の場合は、cmd が単にスタックにプッシュされます。
cmd がスタックにプッシュされる前にコマンドが取り消されていた場合、現在のコマンドおよびそれより上のすべてのコマンドが削除されます。したがって、cmd は常にスタックの最上位に配置されることになります。
コマンドがスタックにプッシュされると、そのコマンドはスタックが管理することになります。コマンドを返すゲッターは存在しません。これは、実行後のコマンドを変更すると、ほぼ確実にドキュメントの状態が破損してしまうためです。
QUndoCommand::id() およびQUndoCommand::mergeWith()も参照してください 。
[slot] void QUndoStack::redo()
QUndoCommand::redo() を呼び出して、現在のコマンドをやり直します。現在のコマンドインデックスをインクリメントします。
スタックが空の場合、またはスタックの先頭にあるコマンドがすでに再実行済みの場合は、この関数は何も行いません。
QUndoCommand::isObsolete() が現在のコマンドに対して true を返す場合、そのコマンドはスタックから削除されます。さらに、clean インデックスが現在のコマンドインデックス以上である場合、clean インデックスはリセットされます。
QString QUndoStack::redoText() const
redo() の次回の呼び出しで再実行されるコマンドのテキストを返します。
注: プロパティ `redoText`のゲッター 関数です。
関連項目: QUndoCommand::actionText() およびundoText()。
[signal] void QUndoStack::redoTextChanged(const QString &redoText)
このシグナルは、redoText() の値が変更されるたびに発火します。これは、createRedoAction() によって返される「やり直し」アクションの text プロパティを更新するために使用されます。redoText は新しいテキストを指定します。
注: プロパティ `redoText` に対する通知 シグナルです。
[slot] void QUndoStack::resetClean()
クリーン状態を解除し、スタックがクリーンだった場合はcleanChanged()を発行します。このメソッドは、クリーンインデックスを-1にリセットします。
これは通常、ドキュメントが以下の状態にある場合に呼び出されます。
- テンプレートに基づいて作成され、まだ保存されていないため、ドキュメントにファイル名が割り当てられていない場合。
- バックアップファイルから復元された場合。
- エディタ外で変更され、ユーザーが再読み込みを行っていない場合。
isClean()、setClean()、およびcleanIndex()も参照してください 。
[slot] void QUndoStack::setClean()
スタックがまだクリーンでない場合、スタックをクリーンとしてマークし、cleanChanged() を出力します。
これは通常、例えばドキュメントを保存する際に呼び出されます。
スタックが「undo」や「redo」コマンドの使用によってこの状態に戻るたびに、cleanChanged() シグナルを発生させます。このシグナルは、スタックがクリーン状態を離れたときにも発生します。
isClean()、resetClean()、およびcleanIndex()も参照してください 。
[slot] void QUndoStack::setIndex(int idx)
現在のコマンドインデックスが `idx` に達するまで、`undo()` または `redo()` を繰り返し呼び出します。この関数は、ドキュメントの状態を前方または後方に巻き戻すために使用できます。`indexChanged()` は 1 回のみ発行されます。
index()、count()、undo()、およびredo()も参照してください 。
QString QUndoStack::text(int idx) const
インデックスidx にあるコマンドのテキストを返します。
beginMacro()も参照してください 。
[slot] void QUndoStack::undo()
QUndoCommand::undo() を呼び出して、現在のコマンドの直下のコマンドを元に戻します。現在のコマンドインデックスを1減らします。
スタックが空の場合、またはスタックの最下位のコマンドがすでに元に戻されている場合、この関数は何も行いません。
コマンドの取り消し後、QUndoCommand::isObsolete()がtrue を返した場合、そのコマンドはスタックから削除されます。さらに、cleanインデックスが現在のコマンドインデックス以上である場合、cleanインデックスはリセットされます。
QString QUndoStack::undoText() const
undo() が次に呼び出された際に元に戻されるコマンドのテキストを返します。
注: プロパティ `undoText`のゲッター 関数です。
関連項目: QUndoCommand::actionText() およびredoText()。
[signal] void QUndoStack::undoTextChanged(const QString &undoText)
このシグナルは、undoText() の値が変更されるたびに発火します。これは、createUndoAction() によって返される元に戻すアクションの text プロパティを更新するために使用されます。undoText は、新しいテキストを指定します。
注: プロパティ `undoText` に対する通知 シグナルです。
© 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.