Защо е по-ефективно да премахнете QGraphicsItem от неговата сцена, преди да го унищожите?

Според документацията на деструктора на QGraphicsItem, „По-ефективно е да премахнете елемента от QGraphicsScene, преди да унищожи елемента."

Защо така? Не мога да се сетя как би могло да промени нещата. И ако има значение, не трябва ли деструкторът на QGraphicsItem просто да извика:

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

Проверих източника и изглежда това не е така, въпреки че понякога ми е трудно да разбера източника на Qt. РЕДАКТИРАНЕ: Вижте коментарите в отговора на jdi.


person Anthony    schedule 02.05.2012    source източник


Отговори (1)


Може би интерпретирам документите по различен начин от вас (не съм погледнал източника):

QGraphicsItem::~QGraphicsItem () [virtual]
Унищожава QGraphicsItem и всички негови деца. Ако този елемент в момента е свързан със сцена, елементът ще бъде премахнат от сцената, преди да бъде изтрит.
Забележка: По-ефективно е да премахнете елемента от QGraphicsScene, преди да унищожите елемента.

Приемам, че това означава, че първо ще го премахне от сцената, преди да го унищожи, защото това е по-ефективно. Но ако кажете, че източникът никъде не посочва, че това се случва, тогава изглежда, че документите ще бъдат неверни?

Ако трябваше да направя предположение защо би било по-ефективно първо да премахна елемента, преди да го унищожа (независимо дали API наистина го прави вместо вас в деструктора), бих си помислил, че ще трябва да се направи с това какво задейства сцената за преиндексиране. Може би чрез изтриване на елемент, който все още е в сцената, каскадните изтривания на дъщерни елементи постоянно ще задействат повторно индексиране на сцената. Докато, ако трябва да премахнете елемента първо, той може ефективно да изтегли цялата йерархия по начин, който изисква само едно актуализиране на сцената, а след това може да се случи нормалното изтриване, без да го засяга допълнително? Възможно е дори да има повече каскадни ефекти от други дъщерни събития/сигнали, докато те се изтриват в рамките на сцената.

Обзалагам се, че логиката зад „Забележката“ е да информира тези, които биха подкласили QGraphicsItem и претоварили деструктора, за да имат предвид необходимостта първо да премахнат от сцената.

person jdi    schedule 02.05.2012
comment
Благодаря за това. Проверих отново източника и всъщност има ред, който проверява дали сцената съществува и ако е така, извиква d_ptr->scene->d_func()->removeItemHelper(this);. Предполагам, че това трябва да е. Така че изглежда, че сте прав, че бележката може просто да е малко подвеждаща (или това, или аз съм глупак). - person Anthony; 03.05.2012
comment
@Anthony: Просто ще продължа с подвеждането :-) . Документите са предназначени да бъдат полезни и ако е било объркващо за вас, това е валидно наблюдение. Добра работа при проверка на източника за потвърждение. - person jdi; 03.05.2012