本页内容

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 撤销框架的概述,请参阅概述文档。

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() 仅在两个命令具有相同 ID(且该 ID 不为 -1)时,才会尝试将它们合并。

另请参阅 mergeWith() 和QUndoStack::push()。

bool QUndoCommand::isObsolete() const

返回该命令是否已过时。

该布尔值用于自动移除在命令栈中已不再必要的命令。函数QUndoStack::push()、QUndoStack::undo()、QUndoStack::redo() 和QUndoStack::setIndex() 都会检查 isObsolete 函数。

另请参阅 setObsolete()、mergeWith()、QUndoStack::push()、QUndoStack::undo() 以及QUndoStack::redo()。

[virtual] bool QUndoCommand::mergeWith(const QUndoCommand *command)

尝试将此命令与command 合并。成功时返回true ;否则返回false 。

如果此函数返回true ,则调用该命令的redo()必须与重做该命令和command 的效果相同。同样,调用该命令的undo()必须与撤销command 和该命令的效果相同。

QUndoStack 仅当两个命令具有相同的 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() 设置两个不同的字符串,请用“\n ”将它们分隔开,并传递给此函数。即使在开发过程中您未对英文字符串使用此功能,您仍可让翻译人员使用两个不同的字符串,以满足特定语言的需求。 上述功能以及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.