Qt撤消框架问题示例:添加/删除项

Qt撤消框架问题示例:添加/删除项,qt,undo,qgraphicsitem,qgraphicsscene,redo,Qt,Undo,Qgraphicsitem,Qgraphicsscene,Redo,我使用QT undo框架示例作为参考,在我的工具中实现此功能。然而,它调用项的析构函数的方式似乎有一个bug 据我所知,QGraphicscene将在项目在现场时承担项目的所有权。但是,从场景中删除这些项目时,“撤消对象:AddCommand”和“RemoveCommand”都应承担这些项目的所有权 AddCommand::~AddCommand() { if (!myDiagramItem->scene()) delete myDiagramItem; } 在Q

我使用QT undo框架示例作为参考,在我的工具中实现此功能。然而,它调用项的析构函数的方式似乎有一个bug

据我所知,QGraphicscene将在项目在现场时承担项目的所有权。但是,从场景中删除这些项目时,“撤消对象:AddCommand”和“RemoveCommand”都应承担这些项目的所有权

AddCommand::~AddCommand()
{
    if (!myDiagramItem->scene())
        delete myDiagramItem;
}
在Qt undo framework示例中,只有AddCommand尝试删除其析构函数中的对象,但如果该项仍在场景中,则不会执行此操作

AddCommand::~AddCommand()
{
    if (!myDiagramItem->scene())
        delete myDiagramItem;
}

在这种情况下,如果我们在相应的AddCommand对象离开堆栈后(使用撤消限制时)从场景中删除该项,则该项将永远不会再次被删除,因为RemoveCommand析构函数不会执行此操作。

我在AddCommand和RemoveCommand类中都使用了一个标志对其进行了修复。它会通知此对象何时应对项目销毁负责。当他们从场景中移除项目时,我将此标志设置为true,并在调用项目的析构函数之前在undo object destructor中测试此标志:

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()方法