2012-05-02 2 views
10

QGraphicsItem destructor documentation에 따르면 "항목을 삭제하기 전에 QGraphicsScene에서 항목을 제거하는 것이 더 효율적입니다."왜 QGraphicsItem을 삭제하기 전에 장면에서 QGraphicsItem을 제거하는 것이 더 효율적입니까?

왜 그럴까요? 나는 그것이 어떻게 변화를 가져올 수 있는지 생각할 수 없다. 나는 소스를 확인

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

, 때로는 내가 Qt는 소스를 이해하기 힘든 시간이 있지만이는 경우가하지 않는 것 : 그리고 변화를 한 경우 QGraphicsItem 소멸자는 호출하지 않아야합니다. EDIT : jdi의 답변에있는 의견을 참조하십시오.

답변

6

은 어쩌면 내가 (나는 소스에보고하지 않은)를 다르게 문서를 해석하고있다 :

QGraphicsItem :: ~ QGraphicsItem은() [가상]
은 QGraphicsItem 모든 아이를 파괴합니다. 이 항목이 현재 장면과 연결되어 있으면 항목이 삭제되기 전에 장면에서 제거됩니다.
참고 : 항목을 삭제하기 전에 QGraphicsScene 에서 항목을 제거하는 것이 더 효율적입니다.

는 그 첫 번째보다 효율적입니다 때문에 파괴하기 전에 현장에서 제거됩니다 의미하는 걸릴. 그러나 출처가 이것이 발생하는 곳을 알려주지 않는다고 말하면 문서가 거짓 일 것입니다.

API를 실제로 소멸자에서 처리하는지 여부에 관계없이 항목을 먼저 제거하는 것이 더 효율적인 이유에 대해 추측해야한다면, 장면을 트리거하여 재 색인화하는 작업을 수행하십시오. 어쩌면 장면에있는 항목을 삭제하면 연속적으로 하위 항목을 삭제하면 계속 장면이 다시 색인화됩니다. 반면에 항목을 먼저 제거하는 경우 장면의 단일 업데이트 만 필요로하는 방식으로 전체 계층 구조를 효율적으로 가져올 수 있으며 더 이상 영향을주지 않으면 서 정상적인 삭제가 발생할 수 있습니다. 장면 내에서 삭제되는 동안 다른 자식 이벤트/신호의 더 많은 계단식 효과가있을 수도 있습니다.

"Note"뒤에 나오는 논리는 QGraphicsItem을 서브 클래스 화하고 소멸자에 과부하를 줘서 장면에서 먼저 제거해야한다는 사실을 염두에 두는 것입니다.

+1

고마워요. 나는 소스를 다시 검사했고 실제로 장면이 존재하는지 검사하는 라인이 있으며, 그렇다면'd_ptr-> scene-> d_func() -> removeItemHelper (this);'를 호출합니다. 그게 틀림 없어. 그래서 그것은 당신이 옳다는 것, 그 노트가 약간 오도하는 것일 수도 있습니다 (그 중 하나 또는 나는 doofus입니다). – Anthony

+0

@Anthony : 오해의 소지가 있습니다 .--). 문서 도구는 도움이 될만한 내용이며, 혼란 스럽다면 올바른 관찰이됩니다. 확인을 위해 출처를 확인하는 것이 좋습니다. – jdi