QUndoCommand Class

QUndoCommandクラスは、QUndoStack に保存されているすべてのコマンドの基本クラスです。詳細...

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

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

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

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

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

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

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

~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

廃止コマンドかどうかを返します。

このブール値は、スタック内で不要になったコマンドを自動的に削除するために使用される。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()も参照してください

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