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 Framework の概要については、概要ドキュメントを参照してください。

QUndoCommandは、ドキュメントに対する1つの編集アクションを表します。例えば、テキストエディタでのテキストブロックの挿入や削除などです。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); }
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);

マクロを作成するもう1つの方法は、便利関数QUndoStack::beginMacro() とQUndoStack::endMacro() を使用することである。

QUndoStackも参照のこと

メンバ関数のドキュメント

[explicit] QUndoCommand::QUndoCommand(QUndoCommand *parent = nullptr)

parent を持つ QUndoCommand オブジェクトを構築する。

parentnullptr でない場合、このコマンドは親の子リストに追加される。親コマンドはこのコマンドを所有し、デストラクタで削除します。

~QUndoCommand()も参照してください

[explicit] QUndoCommand::QUndoCommand(const QString &text, QUndoCommand *parent = nullptr)

与えられたparenttext で QUndoCommand オブジェクトを構築する。

parentnullptr でない場合、このコマンドは親の子リストに追加される。親コマンドはこのコマンドを所有し、デストラクタで削除します。

~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でない場合にのみ、2つのコマンドのマージを試みます。

mergeWith() およびQUndoStack::push()も参照

bool QUndoCommand::isObsolete() const

コマンドが廃止されたかどうかを返します。

この boolean は、スタック内で不要になったコマンドを自動的に削除するために使用される。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でない場合にのみ、2つのコマンドのマージを試みます。

デフォルトの実装は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()も参照してください

© 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.