2012-05-02 5 views
10

Gemäß der QGraphicsItem destructor documentation, "Es ist effizienter, den Artikel aus der QGraphicsScene zu entfernen, bevor das Element zu zerstören."Warum ist es effizienter, ein QGraphicsItem aus seiner Szene zu entfernen, bevor es zerstört wird?

Warum ist das? Ich kann mir nicht vorstellen, wie es einen Unterschied machen könnte. Und wenn es einen Unterschied machen, tut, soll nicht die QGraphicsItem destructor rufen Sie einfach:

if (scene() != NULL) 
    scene()->removeItem(this); 

ich die Quelle überprüft, und dies scheint nicht der Fall zu sein, wenn auch manchmal habe ich eine harte Zeit Quelle Qt zu verstehen. EDIT: Siehe Kommentare in jdi Antwort.

Antwort

6

Vielleicht bin ich der Interpretation die Dokumentation anders als du (ich habe nicht an der Quelle sah):

QGraphicsItem :: ~ QGraphicsItem() [virtuellen]
Zerstört die QGraphicsItem und alle seine Kinder. Wenn dieser Gegenstand derzeit einer Szene zugeordnet ist, wird der Gegenstand vor dem Löschen aus der Szene entfernt.
Hinweis: Es ist effizienter, den Artikel aus der QGraphicsScene zu entfernen, bevor Sie den Artikel zerstören.

Ich nehme, dass es zu bedeuten, wird es aus der Szene vor dem Zerstören zuerst zu entfernen, weil, die effizienter ist. Aber wenn Sie sagen, die Quelle zeigt nicht an, dass dies geschieht, dann scheint es, dass die Dokumente falsch sind?

Wenn ich raten müsste, warum es effizienter wäre, das Element zuerst zu entfernen, bevor es zerstört wird (unabhängig davon, ob die API es wirklich für Sie im Destruktor tut), würde ich denken, dass es müsste Machen Sie mit, was die Szene zum erneuten Indizieren auslöst. Wenn Sie beispielsweise ein Objekt löschen, das sich noch in der Szene befindet, wird die wiederherzustellende Szene durch die überlappenden Löschvorgänge untergeordneter Elemente ständig neu ausgelöst. Wenn Sie das Element zuerst entfernen, kann es die gesamte Hierarchie effizient auf eine Weise herausziehen, die nur eine einzige Aktualisierung der Szene erfordert, und dann kann das normale Löschen stattfinden, ohne es weiter zu beeinflussen. Es kann sogar mehr kaskadierende Effekte anderer untergeordneter Ereignisse/Signale geben, während sie innerhalb der Szene gelöscht werden.

Ich wette, die Logik hinter dem "Hinweis" ist, diejenigen zu informieren, die ein QGraphicsItem subclass und den Destruktor überladen würde, um die Notwendigkeit zu erinnern, von der Szene zuerst zu entfernen.

+1

Danke dafür. Ich habe die Quelle erneut überprüft und es gibt tatsächlich eine Zeile, die prüft, ob die Szene existiert, und wenn ja, ruft 'd_ptr-> scene-> d_func() -> removeItemHelper (this); '. Ich denke, das muss es sein. Es scheint also, dass Sie Recht haben, dass die Note nur ein bisschen irreführend ist (entweder das oder ich bin ein Doofus). – Anthony

+0

@Anthony: Ich werde nur mit irreführend gehen :-). Docs sollen hilfreich sein, und wenn es für Sie verwirrend war, dann ist es eine gültige Beobachtung. Gute Arbeit bei der Überprüfung durch die Quelle zur Bestätigung. – jdi

Verwandte Themen