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

时间:2017-01-15 01:41:50

标签: qt undo qgraphicsitem qgraphicsscene redo

我使用QT撤消框架示例作为参考,以在我的工具中实现此功能。但是,它似乎有一个错误,它调用项目的析构函数的方式。

我知道QGraphicsScene会在场景中承担项目的所有权。但是,两个撤消对象:AddCommand和RemoveCommand在从场景中删除它们时应该承担这些项的所有权。

在Qt撤消框架示例中,只有AddCommand尝试删除其析构函数中的对象,但如果该项目仍在场景中,则不会执行此操作。

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

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

1 个答案:

答案 0 :(得分:0)

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