QUndoStack 类

QUndoStack 类是一个 QUndoCommand 对象的堆栈。...

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

属性

公共函数

QUndoStack(QObject *parent = nullptr)
virtual~QUndoStack()
voidbeginMacro(const QString &text)
boolcanRedo() const
boolcanUndo() const
intcleanIndex() const
voidclear()
const QUndoCommand *command(int index) const
intcount() const
QAction *createRedoAction(QObject *parent, const QString &prefix = QString()) const
QAction *createUndoAction(QObject *parent, const QString &prefix = QString()) const
voidendMacro()
intindex() const
boolisActive() const
boolisClean() const
voidpush(QUndoCommand *cmd)
QStringredoText() const
voidsetUndoLimit(int limit)
QStringtext(int idx) const
intundoLimit() const
QStringundoText() const

公共槽

voidredo()
voidresetClean()
voidsetActive(bool active = true)
voidsetClean()
voidsetIndex(int idx)
voidundo()

信号

voidcanRedoChanged(bool canRedo)
voidcanUndoChanged(bool canUndo)
voidcleanChanged(bool clean)
voidindexChanged(int idx)
voidredoTextChanged(const QString &redoText)
voidundoTextChanged(const QString &undoText)

详细说明

有关Qt的撤销框架概述,请参阅概述文档

撤销堆栈维护已应用于文档的命令列表。

使用push()将新命令推入堆栈。可以使用undo()和redo()撤销和重做命令,或者通过触发createUndoAction()和createRedoAction()返回的操作来执行。

QUndoStack跟踪当前命令。这是在下次调用redo()时执行的命令。该命令的索引由index()返回。可以使用setIndex()向前或向后回滚编辑对象的当前状态。如果堆栈顶部的命令已被重做,则index()等于count()。

QUndoStack提供了对撤销和重做操作、命令压缩、命令宏的支持,并支持清洁状态的概念。

撤销和重做操作

QUndoStack提供了一个方便的撤销和重做QAction对象,可以将其插入到菜单或工具栏中。当撤销或重做命令时,QUndoStack会更新这些操作的文字属性,以反映它们将触发的更改。当没有可用的撤销或重做命令时,这些操作将被禁用。这些操作由QUndoStack::createUndoAction()和QUndoStack::createRedoAction()返回。

命令压缩和宏

当多个命令可以压缩成一个单独的命令,该命令可以通过单一操作撤销和重做时,命令压缩很有用。例如,当用户在文本编辑器中输入一个字符时,会创建一个新的命令。这个命令将字符插入到光标所在位置的文档中。然而,对于用户来说,能够撤销或重做整行、整句或整个段落的输入会更方便。命令压缩允许将这些单字符命令合并为单个命令,以便插入或删除文本范围。有关更多信息,请参阅QUndoCommand::mergeWith()和push()。

命令宏是一系列命令,这些命令一次全被撤销和重做。通过为命令提供一个子命令列表,可以创建命令宏。撤销或重做父命令将导致子命令被撤销或重做。可以显式地通过在QUndoCommand构造函数中指定父类创建命令宏,或者使用便利函数beginMacro()和endMacro()。

尽管命令压缩和宏看起来对用户有相同的效果,但它们往往在应用程序中有不同的用途。如果不需要单独记录较小的更改,并且只有较大的更改对用户来说才有意义,那么微调命令可能很有用。然而,对于需要单独记录的命令或无法压缩的命令,使用宏在保持每个命令的记录的同时,提供更便捷的用户体验很有用。

清洁状态

QUndoStack 支持干净状态的概念。当文档保存到磁盘时,可以使用 setClean() 方法将堆栈标记为干净。每次通过撤销和重做命令使堆栈返回此状态时,它都会发出 cleanChanged 信号。当堆栈离开干净状态时,也会发出此信号。此信号通常用于启用和禁用应用程序中的保存操作,并更新文档标题以反映它包含未保存的更改。

过时命令

QUndoStack 能够从堆栈中删除不再需要的命令。一个例子是在两个命令合并在一起时删除命令,合并后的命令没有任何功能。这可以在移动物理命令时看到,用户将鼠标移到屏幕的一个部分,然后移回原位置。合并的命令导致鼠标移动 0。此命令可以删除,因为它没有任何作用。另一个例子是与由于连接问题而失败的联网命令。在这种情况下,由于存在连接问题,redo() 和 undo() 函数都没有作用。

可以使用 QUndoCommand::setObsolete() 函数将一个命令标记为过时。在调用 QUndoCommand::undo()、QUndoCommand::redo() 和 QUndoCommand:mergeWith() 时(适用),QUndoCommand::isObsolete 标志将在 QUndoStack::push()、 QUndoStack::undo()、QUndoStack::redo() 和 QUndoStack::setIndex() 中进行检查。

如果一个命令被设置为过时,并且干净索引大于或等于当前命令索引,那么当该命令从堆栈中删除时,干净索引将被重置。

另请参阅QUndoCommandQUndoView

属性文档

active : bool

此属性保存此堆栈的活动状态。

一个应用程序通常具有多个撤销堆栈,每个打开的文档都有自己的堆栈。活动堆栈是与当前活动文档相关联的堆栈。如果堆栈属于 QUndoGroup,当它处于活动状态时,对 QUndoGroup::undo() 或 QUndoGroup::redo() 的调用将被转发到此堆栈。如果 QUndoGroup 被一个 QUndoView 查看,那么当它处于活动状态时,视图将显示此堆栈的内容。如果堆栈不属于一个 QUndoGroup,使其活动没有任何效果。

程序员负责指定哪个堆栈是活动的,通常在相关文档窗口获得焦点时调用 setActive()。

访问函数

boolisActive() const
voidsetActive(bool active = true)

另请参阅QUndoGroup

[只读] canRedo : const bool

此属性表示此堆栈是否可以重做。

此属性指示是否有一个可以重做的命令。

访问函数

boolcanRedo() const

通知信号

voidcanRedoChanged(bool canRedo)

另请参阅canRedo(),index(),以及canUndo()。

[只读] canUndo : const bool

此属性表示此堆栈是否可以撤销。

此属性指示是否存在可以撤消的命令。

访问函数

boolcanUndo() const

通知信号

voidcanUndoChanged(bool canUndo)

另请参阅canUndo(),index(),以及canRedo()。

[只读] clean : const bool

此属性表示此堆栈的整洁状态。

此属性指示堆栈是否整洁。例如,当文档已保存时,堆栈即为整洁。

访问函数

boolisClean() const

通知信号

voidcleanChanged(bool clean)

另请参阅isCleansetCleanresetClean,以及cleanIndex

[只读] redoText : const QString

此属性保存下一个要重做的命令的重做文本。

在下一个调用redo之前,此属性保存要重做的命令的文本。

访问函数

QStringredoText() const

通知信号

voidredoTextChanged(const QString &redoText)

另请参阅redoTextQUndoCommand::actionText,以及undoText

undoLimit : int

此属性保存此堆栈上命令的最大数量。

当堆栈上的命令数量超过堆栈的undoLimit时,将从堆栈底部删除命令。宏命令(具有子命令的命令)被视为一个命令。默认值为0,表示没有限制。

在空堆栈设置此属性时才有效,因为在非空堆栈上设置可能会导致当前索引处的命令被删除。非空堆栈上调用 setUndoLimit() 会打印警告并什么都不做。

访问函数

intundoLimit() const
voidsetUndoLimit(int limit)

[只读] undoText : const QString

此属性保存下一个要撤销的命令的撤销文本。

在下一个调用undo之前,此属性保存要撤销的命令的文本。

访问函数

QStringundoText() const

通知信号

voidundoTextChanged(const QString &undoText)

另请参阅undoTextQUndoCommand::actionText,以及redoText

成员函数文档

[显式] QUndoStack::QUndoStack(QObject *parent = nullptr)

使用指定的父对象构建一个空的撤销堆栈。堆栈最初将处于清洁状态。如果 parent 是一个 QUndoGroup 对象,则堆栈将自动添加到该组中。

另请参阅push

[虚函数 noexcept] QUndoStack::~QUndoStack()

销毁撤销堆栈,删除其上的任何命令。如果该堆栈位于 QUndoGroup 中,则堆栈将自动从该组中删除。

另请参阅QUndoStack

void QUndoStack::beginMacro(const QString &text)

以给定的 text 描述开始宏命令的合成。

将指定的 text 描述的空命令推入堆栈。任何后续推入堆栈的命令都将追加到空命令的子项中,直到调用 endMacro()。

beginMacro() 和 endMacro() 的调用可以嵌套,但每个 beginMacro() 调用必须有一个匹配的 endMacro() 调用。

在宏被合成时,堆栈将被禁用。这意味着

当为最外层的宏调用 endMacro() 时,堆栈将变为启用状态,并发出适当的信号。

stack.beginMacro("insert red text");
stack.push(new InsertText(document, idx, text));
stack.push(new SetColor(document, idx, text.length(), Qt::red));
stack.endMacro(); // indexChanged() is emitted

此代码等价于

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

另请参阅endMacro

bool QUndoStack::canRedo() const

如果有可重做的命令,则返回 true;否则返回 false

如果该堆栈为空或堆栈顶部的命令已重做,则此函数返回 false

等同于 index() == count

注意:canRedo 属性的获取函数。

另请参阅index() 和 canUndo

[信号] void QUndoStack::canRedoChanged(bool canRedo)

此信号在 canRedo() 的值更改时发出。它用于启用或禁用由 createRedoAction() 返回的重做动作。canRedo 指定了新值。

注意:canRedo 属性的通知信号。

bool QUndoStack::canUndo() const

如果有可撤销的命令,则返回 true;否则返回 false

如果该堆栈为空,或堆栈底部的命令已撤销,则此函数返回 false

等同于 index() == 0。

注意:canUndo 属性的获取函数。

另请参阅 index() 和 canRedo().

[信号] void QUndoStack::canUndoChanged(bool canUndo)

该信号在 canUndo() 的值更改时发出。它用于启用或禁用由 createUndoAction() 返回的撤消动作。 canUndo 指定新值。

注意: 属性 canUndo 的通知信号。

[信号] void QUndoStack::cleanChanged(bool clean)

该信号在堆栈进入或离开清洁状态时发出。如果 clean 为 true,则堆栈处于清洁状态;否则此信号表示它已离开清洁状态。

注意: 属性 clean 的通知信号。

另请参阅 isClean() 和 setClean().

int QUndoStack::cleanIndex() const

返回清洁索引。这是调用 setClean() 的索引。

堆栈可能没有清洁索引。这发生在文档保存后、某些命令被撤消 ,然后推入新的命令。由于 push() 在推入新命令之前删除所有被撤消的命令,堆栈不能再次回到清洁状态。在这种情况下,此函数返回 -1。在调用 resetClean() 后也可能返回 -1。

另请参阅 isClean() 和 setClean().

void QUndoStack::clear()

通过删除其上的所有命令来清除命令堆栈,并将堆栈返回到清洁状态。

命令不会被撤消或重做;编辑对象的属性状态保持不变。

通常用于放弃文档内容时使用此函数。

另请参阅QUndoStack

QUndoCommand *QUndoStack::command(int index) const

返回对 index 处的命令的 const 指针。

此函数返回一个 const 指针,因为在执行后修改已推入堆栈的命令几乎总是会导致文档状态的损坏。

另请参阅 QUndoCommand::child().

int QUndoStack::count() const

返回堆栈上的命令数量。宏命令计数为一个命令。

另请参阅 index(),setIndex() 和 command().

QAction *QUndoStack::createRedoAction(QObject *parent, const QString &prefix = QString()) const

创建具有给定 parent 的重做 QAction 对象。

触发此动作将触发对redo()的调用。此动作的文本是将在下一次调用redo()时重做的命令文本,前面加上指定的前缀。如果没有可用于重做的命令,此动作将禁用。

如果前缀为空,则使用默认模板“重做 %1”代替前缀。在Qt 4.8之前,默认使用前缀“重做”。

另请参阅createUndoAction(),canRedo(),和QUndoCommand::text

QAction *QUndoStack::createUndoAction(QObject *parent, const QString &prefix = QString()) const

根据给定的父对象创建一个撤销QAction对象。

触发此动作将触发对undo()的调用。此动作的文本是将在下一次调用undo()时撤销的命令文本,前面加上指定的前缀。如果没有可用于撤销的命令,此动作将禁用。

如果前缀为空,则使用默认模板“撤销 %1”代替前缀。在Qt 4.8之前,默认使用前缀“撤销”。

另请参阅createRedoAction(),canUndo(),和QUndoCommand::text

void QUndoStack::endMacro()

结束宏命令的合成。

如果这是嵌套宏集中的最外层宏,此函数将对整个宏命令调用一次indexChanged()。

另请参阅beginMacro

int QUndoStack::index() const

返回当前命令的索引。这是下一次调用redo()时将执行的命令。由于可能撤销了许多命令,这并不总是堆栈中最顶部的命令。

另请参阅setIndex(),undo(),redo(),和count

[信号] void QUndoStack::indexChanged(int idx)

每当命令修改文档状态时,都会发出此信号。当撤销或重做命令时会发生这种情况。当撤销或重做宏命令,或调用setIndex()时,此信号只发出一次。

idx指定当前命令的索引,即下一次调用redo()将执行的命令。

另请参阅index()和setIndex

bool QUndoStack::isClean() const

如果堆栈处于清洁状态,则返回true;否则返回false

注意:属性clean的获取器函数。

另请参阅 setClean() 和 cleanIndex respectfuly.

void QUndoStack::push(QUndoCommand *cmd)

cmd 添加到堆栈或与其最近执行命令合并。在任何情况下,都会通过调用其 redo() 函数执行 cmd

如果 cmd 的 ID 不是 -1,并且与最近执行的命令的 ID 相同,QUndoStack 将尝试通过在最近执行的命令上调用 QUndoCommand::mergeWith() 来合并两个命令。如果 QUndoCommand::mergeWith() 返回 true,则删除 cmd

调用 QUndoCommand::redo() 和,如果适用,QUndoCommand::mergeWith() 后,将针对 cmd 或合并的命令调用 QUndoCommand::isObsolete()。如果 QUndoCommand::isObsolete() 返回 true,则从堆栈中删除 cmd 或合并的命令。

在其他所有情况下,仅将 cmd 添加到堆栈。

如果在 cmd 被推送到堆栈之前撤销了命令,则删除当前命令及其上述所有命令。因此,cmd 总是成为堆栈上的顶层命令。

一旦命令被推送到堆栈,堆栈就负责该命令。由于修改已执行后的文档状态几乎总会导致损坏,因此没有用于返回命令的获取器。

另请参阅 QUndoCommand::id() 以及 QUndoCommand::mergeWith respectfuly。

[slot] void QUndoStack::redo()

通过调用 QUndoCommand::redo() 重做当前命令。增加当前命令索引。

如果堆栈为空,或者堆栈顶部的命令已经重做,则此函数不执行任何操作。

如果 QUndoCommand::isObsolete() 对于当前命令返回 true,则将命令从堆栈中删除。此外,如果干净索引大于或等于当前命令索引,则重置干净索引。

另请参阅 undo() 以及 index respectfuly。

QString QUndoStack::redoText() const

返回将在下一个调用 redo() 时的下一个重做命令的文本。

注意:getter 函数用于属性 redoText。

另请参阅 QUndoCommand::actionText() 以及 undoText respectfuly。

[signal] void QUndoStack::redoTextChanged(const QString &redoText)

此信号在 redoText() 的值更改时发出。它用于更新通过 createRedoAction() 返回的重做动作的文本属性。新文本由 redoText 指定。

注意:属性 redoText 的通知信号。

[slot] void QUndoStack::resetClean()

如果堆栈是干净的,则退出干净状态并发出 cleanChanged()。如果堆栈之前是干净的,此方法将干净索引重置为 -1。

通常在以下情况下调用此方法:文档经过

  • 基于某些模板创建,尚未保存,因此尚无文件名与文档关联。
  • 从备份文件中恢复。
  • 在编辑器外更改,用户未重新加载。

另请参阅isClean(),setClean(),以及 cleanIndex().

[slot] void QUndoStack::setClean()

如果栈未被标记为干净,则标记栈为干净并发出 cleanChanged() 信号。

这通常在文档保存时调用,例如。

当栈使用撤销/重做命令返回到该状态时,它将发出 cleanChanged() 信号。此信号还在栈离开干净状态时发出。

另请参阅isClean(),resetClean(),以及 cleanIndex().

[slot] void QUndoStack::setIndex(int idx)

反复调用 undo() 或 redo(),直到当前命令索引达到 idx。此函数可用于将文档状态向前或向后滚动。仅发出 indexChanged() 一次。

另请参阅index(),count(),undo(),和 redo().

QString QUndoStack::text(int idx) const

返回索引为 idx 的命令的文本。

另请参阅beginMacro

[slot] void QUndoStack::undo()

通过调用 QUndoCommand::undo() 撤销当前命令下面的命令。递减当前命令索引。

如果栈为空,或者栈底命令已经撤销,此函数不执行任何操作。

撤销命令后,如果 QUndoCommand::isObsolete() 返回 true,则该命令将从栈中删除。此外,如果干净索引大于或等于当前命令索引,则重置干净索引。

另请参阅redo() 和 index().

QString QUndoStack::undoText() const

在下一个对 undo() 的调用中,返回将要撤销的命令的文本。

注意:undoText 属性的获取器函数。

另请参阅QUndoCommand::actionText() 和 redoText().

[signal] void QUndoStack::undoTextChanged(const QString &undoText)

每次 undoText() 的值更改时都会发出此信号。它用于更新 createUndoAction() 返回的撤销操作的文本属性。 undoText 指定新文本。

注意:undoText 属性的更新通知信号。

© 2024 Qt公司有限公司。本文件中包含的文档贡献是各自所有者的版权。此处提供的文档是根据自由软件基金会出版并由其公布的GNU自由文档许可版1.3许可条款提供的。Qt及其相关标志是Qt公司有限公司在芬兰和/或其他国家/地区注册的商标。所有其他商标均为各自所有者的财产。