我使用QT undo框架示例作为参考,以便在我的工具中实现此功能。然而,它调用项目的析构函数的方式似乎有一个bug。
据我所知,当项目在场景中时,QGraphicsScene将承担项目的所有权。但是,这两个撤消对象:当从场景中移除这些项目时,AddCommand和RemoveCommand应取得这些项目的所有权。
在Qt undo框架示例中,只有AddCommand尝试删除其析构函数中的对象,但如果该项目仍在场景中,则不会执行此操作。
AddCommand::~AddCommand()
{
if (!myDiagramItem->scene())
delete myDiagramItem;
}
在这种情况下,如果我们在相应的AddCommand对象离开堆栈之后从场景中删除该项(当使用撤消限制时),该项将永远不会被再次删除,因为RemoveCommand析构函数不会这样做。
发布于 2017-01-15 01:41:50
我在AddCommand和RemoveCommand类中都使用了一个标志来修复它。它通知此对象何时应负责项目销毁。当他们从场景中移除项目时,我将这个标志设置为true,并且在调用项目的析构函数之前,我在撤销对象析构函数中测试了这个标志:
AddCommand::AddCommand(QGraphicsScene *scene, DraftGraphicItem* item, QUndoCommand *parent):
scene(scene), item(item), QUndoCommand(parent){
setText("Add item to scene");
}
AddCommand::~AddCommand(){
if(isItemOwner)
delete item;
}
void AddCommand::undo(){
Q_ASSERT(item->scene());
scene->removeItem(item);
isItemOwner = false;
}
void AddCommand::redo(){
Q_ASSERT(!item->scene());
scene->addItem(item);
isItemOwner = true;
}
RemoveCommand也是如此,只需颠倒redo()和undo()方法即可。
https://stackoverflow.com/questions/41656969
复制相似问题