2017-01-15 2 views
0

Ich habe das QT Rückgängig Framework Beispiel als Referenz verwendet, um diese Funktionalität in meinem Tool zu implementieren. Es scheint jedoch einen Fehler mit der Art, wie es den Destruktor der Elemente aufruft, zu haben.Problem mit Qt Rückgängig Framework Beispiel: Hinzufügen/Entfernen von Artikel

Ich verstehe, dass QGraphicsScene Besitz der Elemente übernehmen wird, während sie in der Szene sind. Beide Objekte rückgängig machen: AddCommand und RemoveCommand sollten Besitz dieser Elemente übernehmen, wenn sie sie aus der Szene entfernen.

Im AddOn Framework-Beispiel versucht nur AddCommand das Objekt in seinem Destruktor zu löschen, tut dies jedoch nicht, wenn sich das Objekt noch in der Szene befindet.

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

In diesem Fall, wenn wir das Element aus der Szene nach dem entsprechenden addCommand Objekt verlassen den Stapel (bei Verwendung eines Undo-Limits) entfernen, wird das Element nie wieder da destructor RemoveCommand gelöscht wird es nicht tun .

Antwort

0

Ich habe es mit einem Flag in AddCommand und RemoveCommand-Klassen behoben. Es informiert, wenn diese Objekte für die Elementzerstörung verantwortlich sein sollen. Wenn sie das Element aus der Szene zu entfernen, habe ich diesen Flag auf wahr, und ich teste diesen Flag in dem Objekt destructor undo, bevor die Sache der destructor Aufruf:

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; 
} 

und das gleiches mit RemoveCommand, nur Redo-Invertierung() und Rückgängig() Methoden.