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 Framework の概要については、概要ドキュメントを参照してください。
元に戻すスタックは、ドキュメントに適用されたコマンドのスタックを維持します。
新しいコマンドはpush() を使ってスタックにプッシュされます。コマンドの取り消しややり直しは、undo() やredo() を使用するか、createUndoAction() やcreateRedoAction() が返すアクションをトリガーすることで行えます。
QUndoStackは、current コマンドを追跡する。これは、次にredo ()を呼び出す と実行されるコマンドである。このコマンドのインデックスは、index ()によって返される。編集したオブジェクトの状態は、setIndex() を使用して、ロール・フォワードまたはロール・バックすることができる。スタックの最上位のコマンドが既にやり直されている場合、index() はcount() と等しくなります。
QUndoStackは、元に戻すアクションとやり直しアクション、コマンド圧縮、コマンド・マクロのサポートを提供し、クリーン・ステートの概念をサポートします。
元に戻すアクションとやり直しアクション
QUndoStackは、メニューやツールバーに挿入できる便利なアンドゥとリドゥQAction オブジェクトを提供します。コマンドの取り消しややり直しが行われると、QUndoStackはこれらのアクションのテキストプロパティを更新し、どのような変更がトリガーされるかを反映します。元に戻したりやり直したりできるコマンドがない場合、アクションは無効になります。これらのアクションは、QUndoStack::createUndoAction() およびQUndoStack::createRedoAction() によって返されます。
コマンド圧縮とマクロ
コマンド圧縮は、複数のコマンドを1つのコマンドに圧縮して、1回の操作で元に戻したりやり直したりできる場合に便利です。例えば、ユーザーがテキストエディタで文字を入力すると、新しいコマンドが作成される。このコマンドは、カーソル位置のドキュメントに文字を挿入する。しかし、単語全体、文全体、段落全体の入力を取り消したり、やり直したりできるほうが、ユーザーにとっては便利です。コマンド圧縮では、これらの1文字コマンドを、テキストのセクションを挿入または削除する1つのコマンドに統合することができます。詳細については、QUndoCommand::mergeWith() とpush() を参照のこと。
コマンドマクロは一連のコマンドであり、すべてのコマンドを一度に取り消したり、やり直したりすることができる。コマンドマクロは、コマンドに子コマンドのリストを与えることで作成される。親コマンドを元に戻したりやり直したりすると、子コマンドも元に戻ったりやり直されたりする。コマンド・マクロは、QUndoCommand コンストラクタで親を指定して明示的に作成することも、便利関数beginMacro() やendMacro() を使って作成することもできる。
コマンド圧縮とマクロは、ユーザーには同じ効果に見えますが、アプリケーションでは異なる用途に使われることがよくあります。文書に小さな変更を加えるようなコマンドは、それを個別に記録する必要がなく、大きな変更だけがユーザーに関係するのであれば、圧縮するのが便利でしょう。しかし、個別に記録する必要があるコマンドや、圧縮できないコマンドについては、マクロを使用して、各コマンドの記録を維持しながら、より便利なユーザーエクスペリエンスを提供するのが便利です。
クリーンな状態
QUndoStackはクリーン状態の概念をサポートしています。ドキュメントがディスクに保存されるとき、スタックはsetClean() を使ってクリーン状態としてマークすることができます。コマンドの取り消しややり直しによってスタックがこの状態に戻るときはいつでも、シグナルcleanChanged() を発する。このシグナルは、スタックがクリーンな状態から離れるときにも発せられる。このシグナルは通常、アプリケーションの保存アクションを有効にしたり無効にしたり、ドキュメントのタイトルを更新して未保存の変更が含まれていることを反映したりするために使用されます。
廃止されたコマンド
QUndoStackは、コマンドが不要になった場合、スタックからコマンドを削除することができます。一つの例として、2つのコマンドがマージされ、マージされたコマンドが機能を持たなくなった場合に、コマンドを削除することができます。これは、ユーザーがマウスを画面の一部分に移動させた後、元の位置に移動させる移動コマンドで見られる。マージされたコマンドの結果、マウスの移動は0になる。もう一つの例は、接続の問題で失敗するネットワークコマンドである。この場合、redo ()とundo ()関数は接続に問題があったため機能しないので、コマンドはスタックから削除される。
コマンドは、QUndoCommand::setObsolete ()関数を使用して廃止マークを付けることができる。QUndoCommand::undo ()、QUndoCommand::redo ()、QUndoCommand:mergeWith()を呼び出した後、QUndoStack::push ()、QUndoStack::undo ()、QUndoStack::redo ()、QUndoStack::setIndex ()で、QUndoCommand::isObsolete ()フラグがチェックされる。
コマンドが廃止に設定され、クリーン・インデックスが現在のコマンド・インデックス以上である場合、コマンドがスタックから削除されるとクリーン・インデックスはリセットされる。
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 : const bool
このプロパティは、このスタックがやり直しが可能かどうかを保持する。
このプロパティは、やり直しが可能なコマンドがあるかどうかを示す。
アクセス関数
bool | canRedo() const |
Notifier シグナル:
void | canRedoChanged(bool canRedo) |
canRedo(),index(),canUndo()も参照のこと 。
[read-only]
canUndo : const bool
このプロパティは、このスタックがアンドゥできるかどうかを保持する。
このプロパティは、取り消すことができるコマンドがあるかどうかを示す。
アクセス関数
bool | canUndo() const |
Notifier シグナル:
void | canUndoChanged(bool canUndo) |
canUndo(),index(),canRedo()も参照のこと 。
[read-only]
clean : const bool
このプロパティは、このスタックのクリーン状態を保持する。
このプロパティは、スタックがクリーンであるかどうかを示します。例えば、ドキュメントが保存されたとき、スタックはクリーンです。
アクセス関数
bool | isClean() const |
ノーティファイア・シグナル:
void | cleanChanged(bool clean) |
isClean()、setClean()、resetClean()、cleanIndex()も参照のこと 。
[read-only]
redoText : const QString
このプロパティは、次にやり直されるコマンドのやり直しテキストを保持する。
このプロパティは、redo() の次の呼び出しでやり直されるコマンドのテキストを保持します。
アクセス関数:
QString | redoText() const |
Notifier シグナル:
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 : const QString
このプロパティは、次にアンドゥされるコマンドのアンドゥ・テキストを保持する。
このプロパティは、undo() の次の呼び出しでアンドゥされるコマンドのテキストを保持します。
アクセス関数:
QString | undoText() const |
Notifier シグナル:
void | undoTextChanged(const QString &undoText) |
undoText ()、QUndoCommand::actionText ()、redoText ()も参照 。
メンバ関数ドキュメント
[explicit]
QUndoStack::QUndoStack(QObject *parent = nullptr)
空のアンドゥスタックを親parent で構築します。スタックは最初はクリーンな状態になります。parent がQUndoGroup オブジェクトの場合、スタックは自動的にグループに追加されます。
push()も参照してください 。
[virtual noexcept]
QUndoStack::~QUndoStack()
undo スタックを破棄し、その上にあるコマンドをすべて削除する。スタックがQUndoGroup にある場合、スタックは自動的にグループから削除されます。
QUndoStack()も参照のこと 。
void QUndoStack::beginMacro(const QString &text)
与えられたtext の記述でマクロコマンドの作成を開始する。
指定されたtext で記述された空のコマンドがスタックにプッシュされる。スタックにプッシュされた後続のコマンドは、endMacro() が呼び出されるまで、空のコマンドの子に追加される。
beginMacro()とendMacro()の呼び出しは入れ子にすることができるが、 beginMacro()の呼び出しには必ずendMacro()の呼び出しが必要である。
マクロの実行中は、スタックは無効になる。つまり、beginMacro() と () はネストされる:
- 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 のゲッター関数。
index() およびcanRedo()も参照して ください。
[signal]
void QUndoStack::canUndoChanged(bool canUndo)
このシグナルは、canUndo ()の値が変更されるたびに発せられる。このシグナルは、createUndoAction() が返すアンドゥ動作を有効または無効にするために使用されます。canUndo は新しい値を指定します。
注: プロパティcanUndo に対するノーティファイア・シグナル。
[signal]
void QUndoStack::cleanChanged(bool clean)
このシグナルは、スタックがクリーン・ステートに入ったり、クリーン・ステートを離れたりするたびに発せられる。clean が真の場合、スタックはクリーンな状態にある。そうでない場合、このシグナルはスタックがクリーンな状態を離れたことを示す。
注: clean プロパティに対するノーティファイア・シグナル。
isClean() およびsetClean()も参照のこと 。
int QUndoStack::cleanIndex() const
クリーン・インデックスを返す。これはsetClean() が呼び出されたときのインデックスである。
スタックはクリーンインデックスを持たないかもしれない。これは、ドキュメントが保存され、いくつかのコマンドが取り消されてから新しいコマンドがプッシュされた場合に発生します。push() は、新しいコマンドをプッシュする前に、取り消したコマンドをすべて削除するので、スタックは再びクリーンな状態に戻ることはできない。この場合、この関数は-1を返す。この -1 は、resetClean() を明示的に呼び出した後にも返されることがある。
isClean() およびsetClean()も参照の こと。
void QUndoStack::clear()
コマンドスタック上のすべてのコマンドを削除することによってコマンドスタックをクリアし、スタックをクリーンな状態に戻します。
コマンドの取り消しややり直しは行われず、編集されたオブジェクトの状態は変更されません。
この関数は通常、ドキュメントの内容が破棄されたときに使用されます。
QUndoStack()も参照のこと 。
const QUndoCommand *QUndoStack::command(int index) const
index にあるコマンドへの 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 4.8以前では、接頭辞 "Redo "がデフォルトで使われていました。
createUndoAction(),canRedo(),QUndoCommand::text()も参照してください 。
QAction *QUndoStack::createUndoAction(QObject *parent, const QString &prefix = QString()) const
与えられたparent でアンドゥQAction オブジェクトを作成する。
このアクションをトリガすると、undo() が呼び出される。このアクションのテキストは、次に呼び出されるundo() でアンドゥされるコマンドのテキストで、指定されたprefix が先頭に付きます。元に戻せるコマンドがない場合、このアクションは無効になる。
prefix が空の場合、接頭辞の代わりにデフォルトテンプレート "Undo %1" が使われます。Qt 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() が呼び出されたりすると、このシグナルは一度だけ発せられる。
idx は、現在のコマンドのインデックス、つまり、次に () を呼び出したときに実行されるコマンドを指定する。redo
bool QUndoStack::isClean() const
スタックがクリーンな状態であればtrue
を返し、そうでなければfalse
を返す。
注: プロパティclean のゲッター関数。
setClean() およびcleanIndex()も参照のこと 。
void QUndoStack::push(QUndoCommand *cmd)
cmd をスタックにプッシュするか、最近実行されたコマンドとマージする。どちらの場合も、redo() 関数を呼び出してcmd を実行する。
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() が真を返した場合、そのコマンドはスタックから削除される。さらに、クリーン・インデックスが現在のコマンド・インデックス以上である場合、 クリーン・インデックスはリセットされます。
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() は一度だけ呼び出される。
index()、count()、undo()、redo()も参照の こと。
QString QUndoStack::text(int idx) const
インデックスidx にあるコマンドのテキストを返す。
beginMacro()も参照のこと 。
[slot]
void QUndoStack::undo()
QUndoCommand::undo() を呼び出すことで、現在のコマンドより下のコマンドを取り消す。現在のコマンドのインデックスを減少させる。
スタックが空の場合、またはスタック上の最下位のコマンドが既にアンドゥされている場合、 この関数は何もしない。
コマンドが取り消された後、QUndoCommand::isObsolete() がtrue
を返す場合、そのコマンドはスタックから削除される。さらに、クリーン・インデックスが現在のコマンド・インデックス以上であれば、 クリーン・インデックスはリセットされる。
QString QUndoStack::undoText() const
次にundo() を呼び出したときに取り消されるコマンドのテキストを返します。
メモ: undoText プロパティのゲッター関数。
QUndoCommand::actionText() およびredoText()も参照して ください。
[signal]
void QUndoStack::undoTextChanged(const QString &undoText)
このシグナルは、undoText ()の値が変更されるたびに発せられる。このシグナルは、createUndoAction() が返す undo アクションの text プロパティを更新するために使用されます。undoText は、新しいテキストを指定します。
注: プロパティundoText に対するノーティファイア・シグナル。
© 2025 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.