我使用 QT undo 框架示例作为在我的工具中实现此功能的参考。但是,它调用项目的析构函数的方式似乎有一个错误。
我了解 QGraphicsScene 将在项目位于场景中时承担项目的所有权。但是,两个撤消对象:AddCommand 和 RemoveCommand 在将它们从场景中移除时都应该承担这些项目的所有权。
在 Qt undo 框架示例中,只有 AddCommand 尝试删除其析构函数中的对象,但如果项目仍在场景中,则不会这样做。
AddCommand::~AddCommand()
{
if (!myDiagramItem->scene())
delete myDiagramItem;
}
在这种情况下,如果我们在相应的 AddCommand 对象离开堆栈后从场景中删除该项目(当使用撤消限制时),则该项目将永远不会被再次删除,因为 RemoveCommand 析构函数不会这样做。