QUndoCommand 类

QUndoCommand 类是存储在 QUndoStack 上的所有命令的基类。 更多...

头文件 #include <QUndoCommand>
CMakefind_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmakeQT += gui

公共函数

QUndoCommand(QUndoCommand *parent = nullptr)
QUndoCommand(const QString &text, QUndoCommand *parent = nullptr)
虚拟~QUndoCommand()
QStringactionText() const
const QUndoCommand *child(int index) const
intchildCount() const
虚拟 intid() const
boolisObsolete() const
虚拟 boolmergeWith(const QUndoCommand *command)
虚拟 voidredo()
voidsetObsolete(bool obsolete)
voidsetText(const QString &text)
QStringtext() const
虚拟 voidundo()

详细描述

有关 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

成员函数文档

[显式] QUndoCommand::QUndoCommand(QUndoCommand *parent = nullptr)

构造一个具有父 parent 的 QUndoCommand 对象。

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

参见~QUndoCommand

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

构造一个具有给定 parenttext 的 QUndoCommand 对象。

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

参见~QUndoCommand

[虚拟 noexcept] QUndoCommand::~QUndoCommand()

销毁 QUndoCommand 对象及其所有子命令。

参见QUndoCommand

QString QUndoCommand::actionText() const

返回一个描述这个命令做了什么的简短文本字符串;例如,“插入文本”。

当更新堆栈的撤消和重做操作的文字属性时使用此文本。

参见textsetTextQUndoStack::createUndoActionQUndoStack::createRedoAction

const QUndoCommand *QUndoCommand::child(int index) const

返回索引为 index 的子命令。

参见childCountQUndoStack::command

int QUndoCommand::childCount() const

返回此命令中的子命令数。

参见child

[虚拟] 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().

[虚函数] 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().

[虚函数] 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()().

[虚拟] void QUndoCommand::undo()

撤销文档中的更改。在调用 undo() 之后,文档的状态应与调用 redo() 之前相同。此函数必须在派生类中实现。在此函数中调用 QUndoStack::push(), QUndoStack::undo() 或 QUndoStack::redo() 会导致未定义的行为。

默认实现会在逆序中调用所有子命令的 undo()。

另请参阅 redo().

© 2024 The Qt Company Ltd. 本文档贡献的版权属于其各自的所有者。本文档基于由 Free Software Foundation 发布的 GNU 自由文档许可证版本 1.3 的条款提供。Qt 及相关商标为芬兰的 The Qt Company Ltd. 及其在全球的子公司和附属公司的商标。所有其他商标均为其各自所有者的财产。