2017-01-15 7 views
0

私のツールでこの機能を実装するためのリファレンスとしてQT UNDOフレームワークの例を使用していました。しかし、アイテムのデストラクタを呼び出す方法にバグがあるようです。Qt Undoフレームワークの問題例:アイテムの追加/削除

QGraphicsSceneは、シーン内にあるアイテムの所有権を引き受けることを理解しています。ただし、アンドゥオブジェクト:AddCommandとRemoveCommandは、シーンから削除するときにこれらのアイテムの所有権を引き継ぐ必要があります。

Qt元に戻すフレームワークの例では、AddCommandはデストラクタでオブジェクトを削除しようとしますが、アイテムがまだシーンに残っている場合は削除しません。この場合

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

我々は(アンドゥの上限を使用している場合)スタックを離れる対応AddCommandオブジェクトの後にシーンから項目を削除する場合RemoveCommandデストラクタはそれをしていないので、アイテムは再び削除されません。

答えて

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、ちょうど反転リドゥ()とおよびundo()メソッドを使用します。

関連する問題