#include "operationCommand.h" #include AddItemCommand::AddItemCommand(QGraphicsItem* item, QGraphicsScene* scene, QUndoCommand* parent) : QUndoCommand(parent) { m_pItem = item; m_itemPos = item->pos(); m_pGraphicsScene = scene; } AddItemCommand::~AddItemCommand() { } void AddItemCommand::undo() { m_pGraphicsScene->removeItem(m_pItem); m_pGraphicsScene->update(); } void AddItemCommand::redo() { if(m_pItem->scene()) //因为添加图元后同步创建一条该指令,平且在push进入stack的时候redo会被触发一次,因此这里加判断,防止重复操作 return; m_pGraphicsScene->addItem(m_pItem); m_pItem->setPos(m_itemPos); m_pGraphicsScene->update(); } DeleteItemCommand::DeleteItemCommand(QGraphicsScene* scene, QUndoCommand* parent) : QUndoCommand(parent) { m_pGraphicsScene = scene; m_listItem = scene->selectedItems(); } DeleteItemCommand::~DeleteItemCommand() { } void DeleteItemCommand::undo() { foreach(QGraphicsItem* item, m_listItem) { QGraphicsItemGroup* group = dynamic_cast(item->parentItem()); if(!group) { m_pGraphicsScene->addItem(item); } } m_pGraphicsScene->update(); } void DeleteItemCommand::redo() { foreach(QGraphicsItem* item, m_listItem) { QGraphicsItemGroup* group = dynamic_cast(item->parentItem()); if(!group) { m_pGraphicsScene->removeItem(item); //remove即可,不要delete,因为会影响撤回(undo)操作 } } m_pGraphicsScene->update(); }