2017-01-15 8 views
0

내 도구에서이 기능을 구현하기 위해 참조로 QT 실행 취소 프레임 워크 예제를 사용하고있었습니다. 그러나 항목의 소멸자를 호출하는 방법에 버그가있는 것으로 보입니다.Qt 실행 취소 프레임 워크 예제 : 항목 추가/제거

QGraphicsScene은 장면에있는 동안 아이템 소유권을 갖게됩니다. 그러나 AddCommand 및 RemoveCommand는 장면에서 항목을 제거 할 때이 항목의 소유권을 가져야합니다.

Qt 실행 취소 프레임 워크 예제에서 AddCommand는 소멸자에서 개체를 삭제하려고 시도하지만 항목이 아직 장면에있는 경우에는 수행하지 않습니다. 우리는 (실행 취소 한계를 사용하는 경우) 스택을두고 해당 AddCommand 객체 후 현장에서 항목을 제거하면이 경우

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

는 항목이 RemoveCommand 소멸자 그것을하지 않기 때문에 다시 삭제되지 않습니다 .

답변

0

AddCommand 클래스와 RemoveCommand 클래스의 플래그를 사용하여 수정했습니다. 이 객체가 항목 파괴를 담당해야하는시기를 알려줍니다.() 단지 다시 실행 반전,

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와 같은 : 그들은 현장에서 항목을 제거 할 때, 나는 참으로이 플래그를 설정하고, 나는 항목의 소멸자 호출하기 전에 취소 객체의 소멸자에서이 플래그를 테스트 및 undo() 메소드.