QUndoStack 删除特定命令

QUndoStack remove specific command

本文关键字:命令 删除 QUndoStack      更新时间:2023-10-16

如何从QUndoStack中删除特定命令?

此命令可以通过其索引或指针给出。

如果您使用的是Qt 5.9,则QUndoStack::command(int index)QUndoCommand::setObsolete(bool obsolete)函数可能是您正在寻找的。QUndoStack::redo()命令中的相关文档提供了如何处理过时命令的说明:

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

这就是堆栈的事情 - 你只在堆栈之上工作。你可以推动,你可以弹出。您不会从堆栈中间删除内容。

在撤消-重做方案中,这一点更为重要,因为必须努力保留命令的顺序才能使整个事情正常工作。否则你会打破它。

这就是为什么它被称为"撤消堆栈"而不是"反向任意操作whatchamacallit"。

QUndoStack::setIndex(int idx)将撤消所有命令,直到提供的索引。但是您不能真正只删除特定命令。您需要撤消所有命令,直到到达并删除所需的命令。

正如@dtech所指出的,撤消不在最近推送的命令(即堆栈顶部的命令(的命令是没有意义的。

但是,撤消最近推送的命令确实有意义。QUndoStack提供了一种非常方便的方法:QUndoStack::undo().

但是,这不会删除该命令,因为它仍然可以通过QUndoStack::push(...).要真正删除该命令,必须在撤消之前将其标记为过时

auto* cmd = const_cast<QUndoCommand*>(undo_stack.command(undo_stack.count()-1));
cmd->undo();             // must be called explicitly
cmd->setObsolete(true);
undo_stack.undo();

它需要一个const_cast,所以我称之为黑客。但对我来说,它有效。