2012-05-02 11 views
10

Zgodnie z QGraphicsItem destructor documentation "Skuteczniejsze jest usunięcie przedmiotu z QGraphicsScene przed zniszczeniem elementu."Dlaczego skuteczniejsze jest usunięcie obiektu QGraphicsItem ze sceny przed zniszczeniem?

Dlaczego tak jest? Nie mogę myśleć o tym, jak to może coś zmienić. A jeśli tak zrobić różnicę, nie powinny destruktor QGraphicsItem zadzwoń:

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

sprawdziłem źródła, a to nie wydaje się być w przypadku, chociaż czasami mam trudny czas zrozumienia źródła Qt. EDYCJA: Zobacz komentarze w odpowiedzi jdi.

Odpowiedz

6

Może jestem interpretacji docs inaczej niż ty (ja nie spojrzał na źródło):

QGraphicsItem :: ~ QGraphicsItem() [virtual]
Niszczy QGraphicsItem i wszystkie jego dzieci. Jeśli ten element jest obecnie powiązany ze sceną , element zostanie usunięty ze sceny przed jej usunięciem.
Uwaga: Skuteczniejsze jest usunięcie przedmiotu z QGraphicsScene przed zniszczeniem przedmiotu.

Biorę że oznaczać to będzie usunąć go ze sceny zanim niszcząc ponieważ, który jest bardziej wydajny. Ale jeśli powiesz, że źródło nie wskazuje nigdzie, że tak się dzieje, to wydaje się, że dokumenty byłyby fałszywe?

Gdybym musiał zgadywać, dlaczego skuteczniejsze byłoby usunięcie przedmiotu przed zniszczeniem (bez względu na to, czy API naprawdę to zrobi w destruktorze), myślę, że musiałoby z tym, co wyzwala ponowne wyindeksowanie sceny. Być może poprzez usunięcie elementu, który wciąż znajduje się na scenie, kaskadowe usuwanie elementów podrzędnych stale wyzwala scenę do ponownego indeksowania. Gdyby jednak najpierw usunąć przedmiot, może on skutecznie wyciągnąć całą hierarchię w sposób, który wymaga tylko jednej aktualizacji sceny, a następnie normalne usunięcie może nastąpić bez dalszego wpływania na niego? Może nawet występować więcej kaskadowych efektów innych zdarzeń/sygnałów potomnych, gdy są one usuwane w scenie.

Założę się, że logika stojąca za "Uwaga" jest informowanie tych, którzy podklasy QGraphicsItem i przeciążenie destruktora, aby pamiętać o konieczności usunięcia ze sceny w pierwszej kolejności.

+1

Dzięki za to. Sprawdziłem źródło ponownie i rzeczywiście jest tam linia, która sprawdza, czy scena istnieje, a jeśli tak, wywołuje 'd_ptr-> scene-> d_func() -> removeItemHelper (this);'. Chyba to musi być to. Wydaje się więc, że masz rację, że notatka może być po prostu trochę myląca (albo to, albo jestem doofusem). – Anthony

+0

@Anthony: Po prostu idę z wprowadzającym w błąd :-). Dokumenty mają być pomocne, a jeśli było to mylące, to jest to ważna obserwacja. Dobra robota przy sprawdzaniu źródła w celu potwierdzenia. – jdi

Powiązane problemy