如何从QUndoStack
删除特定命令?
此命令可由其索引或指针给出。
答案 0 :(得分:5)
如果您使用的是Qt 5.9,那么QUndoStack::command(int index)
和QUndoCommand::setObsolete(bool obsolete)
功能可能正是您所需要的。 QUndoStack::redo()
命令中的relevant docs提供了如何处理已废弃命令的说明:
如果
QUndoCommand::isObsolete()
对当前命令返回true,则该命令将从堆栈中删除。此外,如果clean索引大于或等于当前命令索引,则重置clean索引。
答案 1 :(得分:2)
关于堆栈的问题 - 你只能在堆栈上工作。你可以推,你可以弹出。你不会从堆栈中间删除东西。
在undo-redo场景中,这一点更为重要,因为必须努力保留命令的顺序才能使整个事情发挥作用。否则你会打破它。
这就是为什么它被称为“撤销堆栈”而不是“反向任意行为whatchamacallit”。
有QUndoStack::setIndex(int idx)
将撤消所有命令,直到提供的索引为止。但是你不能真正删除一个特定的命令。您需要撤消所有命令,直到找到并删除所需命令。
答案 2 :(得分:0)
正如@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
,所以我称其为hack。但是对我来说,它有效。