使用QUndoCommand的子级/父级一次推送多个命令以撤消堆栈
Using children/parent of QUndoCommand to push several commands to undo stack at once
我正在使用QUndoStack实现具有undo堆栈的可编辑树。删除节点需要删除它的所有子项。我正在使用child QUndoCommand进行以下操作:
标题:
class RemoveNodeCommand : QUndoCommand
{
public:
RemoveNodeCommand(NodesContainer *cont, int node_id, QUndoCommand *parent = 0);
void undo();
void redo();
private:
NodeParams mParams;
NodesContainer *mCont;
};
命令执行:
RemoveNodeCommand::RemoveNodeCommand(NodesContainer *cont, int node_id, QUndoCommand *parent)
{
QList<int> offsprings_ids;
QUndoCommand *tmpcomm;
//Keep params of deleted notes to use in Undo if necessary
mParams = cont->getNogeParams();
mCont = cont;
//List all offsprings of node to be deleted
cont->getOffspringsIds(&offsprings_ids);
for(int co = 0; co < basket.size(); co++)
{
tmpcomm = new RemoveNodeCommand(cont, offsprings_ids.at(co), this);
}
}
void RemoveNodeCommand::redo()
{
mCont->deleteNode(mParams);
}
插入树编辑类:
RemoveNodeSlot(int id)
{
mUndoStack->push( new RemoveNodeCommand(mContainer, id));
}
QUndoStack文档中指出
如果父项不为0,则此命令将附加到父项的子列表中,
的确,每次创建新的子命令时,父命令的child_list都会增加。然而,强迫父母并不会导致强迫所有的孩子。只对父节点调用redo()
我做错了什么?我需要手动推送所有孩子吗?而且,由于我需要在一个撤消步骤中使用所有这些命令,我需要使用beginMacro和endMacro?但这样,在QUndoCommand中持有指向子命令的指针是毫无意义的。我想这不是QT故障,而是我对撤销堆栈概念的误解。如何正确使用子命令机制?
有必要在嵌套实现中调用QUndoCommand::undo()和QUndoCommand::redo()的默认实现。在redo()中,必须在处理数据之前添加默认实现,在undo()-在所有树数据处理之后添加默认实现。
void RemoveNodeCommand::redo()
{
QUndoCommand::redo();
mCont->deleteNode(mParams);
}
子命令构造函数需要将父参数传递给QUndoCommand构造函数:
RemoveNodeCommand::RemoveNodeCommand(NodesContainer *cont, int node_id, QUndoCommand *parent)
: QUndoCommand(parent) {
// ...
}
因为您为父级和子级使用单个类,所以您还需要调用父级的undo+redo方法,如Dmitry Kurgansky 所解释的
相关文章:
- 从命令行c++发送文本文件名
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 使用QProcess执行命令,并将结果存储在QStringList中
- 数组长度,为什么从命令行获取时不能使用它?
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- clang整洁10忽略了我的NOLINT命令
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 如何使用ESP8266向谷歌主页发送命令
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 通过 Openssl 命令行加密,通过 c++ 解密
- CMake "--target install"无需"--build"命令行
- C 撤消命令 /反向以前的状态
- 撤消/重做的命令模式:何时不合并撤消命令
- 使用QUndoCommand的子级/父级一次推送多个命令以撤消堆栈