gpt4 book ai didi

c++ - 使用 QUndoCommand 的子级/父级一次推送多个命令以撤消堆栈

转载 作者:搜寻专家 更新时间:2023-10-31 02:21:41 25 4
gpt4 key购买 nike

我正在使用 QUndoStack 实现带有撤消堆栈的可编辑树。删除节点需要删除所有它的后代。我为此使用子 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 文档中指出
如果 parent 不为 0,则此命令附加到 parent 的子列表。
的确,每次创建新的子命令时,父命令的 child_list 都会增加。但是,插入父级不会导致插入其所有子级。 redo() 只为父节点调用。
我做错了什么?我需要手动推送所有 child 吗?而且,因为我需要在单个撤消步骤中执行所有这些命令,所以我需要使用 beginMacro 和 endMacro 吗?但是这样,在 QUndoCommand 中保存指向子命令的指针是没有意义的。我想这不是QT的错,而是我对撤销栈概念的误解。如何正确使用子命令机制?

最佳答案

有必要在嵌套实现中调用 QUndoCommand::undo() 和 QUndoCommand::redo() 的默认实现。在 redo() 中,默认实现必须在处理数据之前添加,而在 undo() 中 - 在所有树数据处理之后。

void RemoveNodeCommand::redo()
{
QUndoCommand::redo();
mCont->deleteNode(mParams);
}

关于c++ - 使用 QUndoCommand 的子级/父级一次推送多个命令以撤消堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31148617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com