QUndoStack 删除特定命令
QUndoStack remove specific command
如何从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
,所以我称之为黑客。但对我来说,它有效。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从命令行c++发送文本文件名
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 从链接列表c++中删除一个项目
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在命令行上将输入显示到数组中时如何删除 ./a.out?
- QUndoStack 删除特定命令
- 运行gcovr命令后,无法生成代码覆盖率,也无法从子目录中删除.gcda
- 在命令上创建或删除GDI形状
- 使用命令行标志删除Google测试锅炉框架输出
- MyTest1.exe 在 C++ / MFC 程序中触发了删除命令的断点
- 悬空指针和删除命令C++
- C++正在删除命令行
- _block_type_is_valid(phead- nblockuse)因为删除命令
- 在Xcode中使用gcc构建时,如何删除不需要的命令行选项?
- c++删除和重命名命令
- Git 状态显示奇怪的未跟踪"path_of_filer"文件,如何通过命令行删除
- 当从c#调用外部dll时,从命令行参数中删除空格