QUndoStack Class

QUndoStackクラスは、QUndoCommand オブジェクトのスタックです。詳細...

Header: #include <QUndoStack>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
Inherits: 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つのコマンドがマージされ、マージされたコマンドが機能を持たなくなった場合に、コマンドを削除することができます。これは、ユーザーがマウスを画面の一部分に移動させた後、元の位置に移動させる移動コマンドで見られる。このコマンドは何の役にも立たないので、削除してもよい。もう一つの例は、接続の問題で失敗するネットワークコマンドである。この場合、redo ()とundo ()関数は接続に問題があったため機能しないので、コマンドはスタックから削除される。

コマンドは、QUndoCommand::setObsolete ()関数を使用して廃止マークを付けることができる。QUndoCommand::undo ()、QUndoCommand::redo ()、QUndoCommand:mergeWith()を呼び出した後、QUndoStack::push ()、QUndoStack::undo ()、QUndoStack::redo ()、QUndoStack::setIndex ()で、QUndoCommand::isObsolete ()フラグがチェックされる。

コマンドが廃止に設定され、クリーン・インデックスが現在のコマンド・インデックス以上である場合、コマンドがスタックから削除されるとクリーン・インデックスはリセットされる。

QUndoCommand およびQUndoViewも参照してください

プロパティの説明

active : bool

このプロパティは、このスタックのアクティブ状態を保持します。

アプリケーションは、多くの場合、複数の取り消しスタックを持っています。アクティブなスタックは、現在アクティブなドキュメントに関連付けられているものです。スタックがQUndoGroup に属している場合、QUndoGroup::undo() またはQUndoGroup::redo() への呼び出しは、それがアクティブなときにこのスタックに転送される。QUndoGroupQUndoView に監視されている場合、ビューがアクティブになると、このスタックの内容が表示される。スタックが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 で空のアンドゥスタックを構築する。スタックは初期状態ではクリーンな状態である。parentQUndoGroup オブジェクトの場合、スタックは自動的にグループに追加されます。

push()も参照してください

[virtual noexcept] QUndoStack::~QUndoStack()

undo スタックを破棄し、その上にあるコマンドをすべて削除します。スタックがQUndoGroup の場合、スタックは自動的にグループから削除される。

QUndoStack() も参照

void QUndoStack::beginMacro(const QString &text)

指定されたtext 記述を持つマクロコマンドの作成を開始する。

指定されたtext で記述された空のコマンドがスタックにプッシュされる。スタックにプッシュされた後続のコマンドは、endMacro() が呼び出されるまで、空のコマンドの子に追加される。

beginMacro()とendMacro()の呼び出しは入れ子にすることができるが、 beginMacro()の呼び出しには必ずendMacro()の呼び出しが必要である。

マクロの実行中は、スタックは無効になる。つまり、beginMacro()と()はネストできる:

一番外側のマクロに対して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 を返す。

index() ==count() と同義。

注: プロパティ 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

スタック上のコマンド数を返す。マクロコマンドもひとつのコマンドとして数えます。

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()が呼び出されると、このシグナルは1回だけ発せられる。

idx は、現在のコマンドのインデックス、つまり、次に () を呼び出したときに実行されるコマンドを指定する。redo

index() およびsetIndex()も参照

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() が真を返した場合、そのコマンドはスタックから削除される。さらに、クリーン・インデックスが現在のコマンド・インデックス以上である場合、 クリーン・インデックスはリセットされます。

undo() およびindex()も参照

QString QUndoStack::redoText() const

redo() の次の呼び出しでやり直されるコマンドのテキストを返す。

注釈 redoText プロパティのゲッター関数です。

QUndoCommand::actionText() およびundoText()も参照

[signal] void QUndoStack::redoTextChanged(const QString &redoText)

このシグナルは、redoText() の値が変更されるたびに発行されます。このシグナルは、createRedoAction() によって返された redo アクションの 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 を返す場合、そのコマンドはスタックから削除される。さらに、クリーン・インデックスが現在のコマンド・インデックス以上であれば、 クリーン・インデックスはリセットされる。

redo() およびindex()も参照

QString QUndoStack::undoText() const

次にundo() を呼び出したときに元に戻されるコマンドのテキストを返します。

注釈 undoText プロパティのゲッター関数です。

QUndoCommand::actionText() およびredoText()も参照してください

[signal] void QUndoStack::undoTextChanged(const QString &undoText)

このシグナルは、undoText() の値が変更されるたびに発行されます。このシグナルは、createUndoAction() が返す undo アクションの text プロパティを更新するために使用されます。undoText は、新しいテキストを指定します。

注: プロパティundoText に対するノーティファイア・シグナルです。

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。