QUndoStack删除特定命令

时间:2017-07-07 13:09:10

标签: c++ qt

如何从QUndoStack删除特定命令?

此命令可由其索引或指针给出。

3 个答案:

答案 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。但是对我来说,它有效。