QUndoCommand Class
QUndoCommand クラスは、QUndoStack に保存されるすべてのコマンドの基底クラスです。詳細...
| ヘッダー: | #include <QUndoCommand> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
| qmake: | QT += gui |
パブリック関数
| QUndoCommand(QUndoCommand *parent = nullptr) | |
| QUndoCommand(const QString &text, QUndoCommand *parent = nullptr) | |
| virtual | ~QUndoCommand() |
| QString | actionText() const |
| const QUndoCommand * | child(int index) const |
| int | childCount() const |
| virtual int | id() const |
| bool | isObsolete() const |
| virtual bool | mergeWith(const QUndoCommand *command) |
| virtual void | redo() |
| void | setObsolete(bool obsolete) |
| void | setText(const QString &text) |
| QString | text() const |
| virtual void | undo() |
詳細な説明
Qt の Undo フレームワークの概要については、概要ドキュメントを参照してください。
QUndoCommand は、ドキュメントに対する単一の編集操作(たとえば、テキストエディタでのテキストブロックの挿入や削除など)を表します。QUndoCommand は、redo() を使用してドキュメントに変更を適用し、undo() を使用してその変更を元に戻すことができます。これらの関数の実装は、派生クラスで提供する必要があります。
class AppendText : public QUndoCommand
{
public:
AppendText(QString *doc, const QString &text)
: m_document(doc), m_text(text) { setText("append text"); }
void undo() override
{ m_document->chop(m_text.length()); }
void redo() override
{ m_document->append(m_text); }
bool mergeWith(const QUndoCommand *other) override;
private:
QString *m_document;
QString m_text;
};QUndoCommand には、text() が関連付けられています。これは、コマンドの動作を説明する短い文字列です。これは、スタックの「元に戻す」および「やり直し」アクションのテキストプロパティを更新するために使用されます。QUndoStack::createUndoAction() およびQUndoStack::createRedoAction() を参照してください。
QUndoCommand オブジェクトは、それがプッシュされたスタックによって所有されます。QUndoStack は、コマンドが元に戻され、新しいコマンドがプッシュされた場合に、そのコマンドを削除します。例えば:
MyCommand *command1 = new MyCommand();
stack->push(command1);
MyCommand *command2 = new MyCommand();
stack->push(command2);
stack->undo();
MyCommand *command3 = new MyCommand();
stack->push(command3); // command2 gets deleted実質的に、コマンドがプッシュされると、そのコマンドはスタックの最上位のコマンドとなります。
コマンドの圧縮をサポートするため、QUndoCommandにはid()と仮想関数mergeWith()が備わっています。これらの関数はQUndoStack::push()によって使用されます。
コマンドマクロをサポートするため、QUndoCommandオブジェクトは任意の数の子コマンドを持つことができます。親コマンドを元に戻したりやり直したりすると、子コマンドも同様に元に戻されたりやり直されたりします。コマンドは、コンストラクタ内で明示的に親に割り当てることができます。この場合、そのコマンドは親によって所有されます。
この場合の親は通常、undo() やredo() の独自の実装を提供しない、いわゆる「空のコマンド」です。その代わりに、これらの関数の基底実装を使用します。基底実装は、すべての子に対してundo() またはredo() を単純に呼び出すだけです。ただし、親には意味のあるtext() が定義されている必要があります。
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);マクロを作成するもう一つの方法は、便利関数であるQUndoStack::beginMacro() およびQUndoStack::endMacro() を使用することです。
QUndoStackも参照してください 。
メンバ関数のドキュメント
[explicit] QUndoCommand::QUndoCommand(QUndoCommand *parent = nullptr)
親がparent であるQUndoCommandオブジェクトを作成します。
parent がnullptr でない場合、このコマンドは親の子リストに追加されます。その後、親コマンドがこのコマンドを所有し、そのデストラクタ内で削除します。
~QUndoCommand()も参照してください 。
[explicit] QUndoCommand::QUndoCommand(const QString &text, QUndoCommand *parent = nullptr)
指定されたparent およびtext を使用して、QUndoCommandオブジェクトを構築します。
parent がnullptr でない場合、このコマンドは親の子リストに追加されます。その後、親コマンドがこのコマンドを所有し、そのデストラクタ内でこのコマンドを削除します。
~QUndoCommand()も参照してください 。
[virtual noexcept] QUndoCommand::~QUndoCommand()
QUndoCommand オブジェクトと、そのすべての子コマンドを破棄します。
QUndoCommand()も参照してください 。
QString QUndoCommand::actionText() const
このコマンドの機能説明となる短いテキスト文字列を返します。例:「テキストを挿入」。
このテキストは、スタックの「元に戻す」および「やり直し」アクションのテキストプロパティが更新される際に使用されます。
text()、setText()、QUndoStack::createUndoAction()、およびQUndoStack::createRedoAction()も参照してください 。
const QUndoCommand *QUndoCommand::child(int index) const
index にある子コマンドを返します。
childCount() およびQUndoStack::command()も参照してください 。
int QUndoCommand::childCount() const
このコマンドに含まれる子コマンドの数を返します。
child()も参照してください 。
[virtual] int QUndoCommand::id() const
このコマンドの ID を返します。
コマンド ID はコマンドの圧縮に使用されます。このコマンドのクラス内で一意な整数である必要があります。コマンドが圧縮をサポートしていない場合は -1 を返します。
コマンドが圧縮をサポートしている場合、正しい ID を返すために、派生クラスでこの関数をオーバーライドする必要があります。基底クラスの実装では -1 を返します。
QUndoStack::push() は、2 つのコマンドの ID が同じであり、かつその ID が -1 でない場合にのみ、それらのコマンドの統合を試みます。
mergeWith() およびQUndoStack::push()も参照してください 。
bool QUndoCommand::isObsolete() const
そのコマンドが廃止済みであるかどうかを返します。
このブール値は、スタック内でもはや必要とされないコマンドを自動的に削除するために使用されます。isObsolete関数は、QUndoStack::push()、QUndoStack::undo()、QUndoStack::redo()、およびQUndoStack::setIndex()の各関数内でチェックされます。
setObsolete()、mergeWith()、QUndoStack::push()、QUndoStack::undo()、およびQUndoStack::redo()も参照してください 。
[virtual] bool QUndoCommand::mergeWith(const QUndoCommand *command)
このコマンドをcommand とマージしようとします。成功した場合はtrue を返し、失敗した場合はfalse を返します。
この関数が `true` を返した場合、このコマンドの `redo()` を呼び出すと、このコマンドと `command` の両方を再実行したのと同じ効果が得られなければなりません。同様に、このコマンドの `undo()` を呼び出すと、`command ` とこのコマンドを元に戻したのと同じ効果が得られなければなりません。
QUndoStack 2つのコマンドのIDが同一であり、かつそのIDが-1でない場合にのみ、それらの統合が試みられます。
デフォルトの実装では、false を返します。
bool AppendText::mergeWith(const QUndoCommand *other)
{
if (other->id() != id()) // make sure other is also an AppendText command
return false;
m_text += static_cast<const AppendText*>(other)->m_text;
return true;
}id() およびQUndoStack::push()も参照してください 。
[virtual] void QUndoCommand::redo()
ドキュメントに変更を適用します。この関数は派生クラスで実装する必要があります。この関数からQUndoStack::push()、QUndoStack::undo()、またはQUndoStack::redo()を呼び出すと、未定義の挙動を引き起こします。
デフォルトの実装では、すべての子コマンドに対してredo()を呼び出します。
undo()も参照してください 。
void QUndoCommand::setObsolete(bool obsolete)
obsolete に対して、そのコマンドが廃止されたかどうかを設定します。
isObsolete()、mergeWith()、QUndoStack::push()、QUndoStack::undo()、およびQUndoStack::redo()も参照してください 。
void QUndoCommand::setText(const QString &text)
コマンドのテキストを、指定されたtext に設定します。
指定するテキストは、このコマンドの機能を一言で説明する、ユーザーが理解しやすい短い文字列である必要があります。
text() とactionText() で 2 つの異なる文字列を使用する必要がある場合は、それらを "\n" で区切って、この関数に渡してください。開発中に英語の文字列に対してこの機能を使用しない場合でも、特定の言語のニーズに合わせて、翻訳者が 2 つの異なる文字列を使用できるようにすることができます。 上記の機能および関数 `actionText()` は、Qt 4.8 以降で利用可能です。
text()、actionText()、QUndoStack::createUndoAction()、およびQUndoStack::createRedoAction()も参照してください 。
QString QUndoCommand::text() const
このコマンドの機能の説明となる短いテキスト文字列を返します。例えば、「テキストを挿入」などです。
このテキストは、QUndoView 内の項目の名前として使用されます。
actionText()、setText()、QUndoStack::createUndoAction()、およびQUndoStack::createRedoAction()も参照してください 。
[virtual] void QUndoCommand::undo()
ドキュメントへの変更を元に戻します。undo() が呼び出された後、ドキュメントの状態は、redo() が呼び出される前の状態と同じになる必要があります。この関数は派生クラスで実装する必要があります。この関数内からQUndoStack::push()、QUndoStack::undo()、またはQUndoStack::redo() を呼び出すと、未定義の挙動を引き起こします。
デフォルトの実装では、すべての子コマンドに対して、逆順で undo() を呼び出します。
redo()も参照してください 。
© 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.