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); }
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)

构造一个 QUndoCommand 对象,父对象为parent

如果parent 不是nullptr ,则该命令会被附加到父命令的子命令列表中。父命令拥有该命令,并将在其析构函数中删除该命令。

另请参阅 ~QUndoCommand() 。

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

用给定的parenttext 构造一个 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 XML 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.