2011-09-15 4 views
8

QGraphicsScene에서 파생 된 클래스를 작성했습니다. 어느 시점에서 장면에서 모든 항목을 제거해야하며 항목을 물리적으로 소멸 시키길 원합니다 (소멸자가 호출 됨). 나는 시도 다음과 같은 : 경고 : C4150 :QGraphicsScene에서 모든 QGraphicsItem을 삭제하는 방법

QList<QGraphicsItem*> all = items(); 
for (int i = 0; i < all.size(); i++) 
{ 
    QGraphicsItem *gi = all[i]; 
    removeItem(gi); 
    delete gi; // warning at this line 
} 

Qt는 창조주는 경고 방출 불완전 형 'QGraphicsItem'포인터의 삭제; 소멸자가 없습니다

왜 그런지 모르겠습니다. QGraphicsItem에는 가상 소멸자가 있으므로 항목을 메모리에서 삭제해야합니다.

올바른 방법이 아니면 QGraphicsScene에서 QGraphicsItem을 모두 삭제할 수 있나요? 장면이 삭제되면 모든 항목도 삭제된다는 것을 알고 있습니다. 하지만 장면에서 항목을 제거하고 다른 항목을 그립니다. 삭제 된 항목을 메모리에서 삭제하고 싶습니다.

답변

7

당신은 그 파일에

#include <QGraphicsItem> 

에 있습니다. 그렇지 않으면, 컴파일러는 헤더 파일을 누락, jpalecek 지적

9

처럼 등이 가상 소멸자를 가지고, QGraphicsItem이 무엇인지 알 수 없습니다. 그의 대답을 받아 들여야합니다. 두 가지 잠재적 인 문제를 지적 할 예정입니다.

우선 QGraphicsScene::removeItem()으로 전화하지 않아도됩니다. QGraphicsItem::~QGraphicsItem() 그럴 수 있습니다.

둘째. QGraphicsItem을 다른 사람의 안에 넣으면주의하십시오. 즉, 다른 항목의 하위 항목이 있습니다. QGraphicsItem의 소멸자는 모든 자식을 자동으로 삭제합니다. 따라서 QGraphicsScene에서 반환 된 항목을 반복하면 상위 항목에서 이미 삭제 된 하위 항목이 삭제 될 수 있습니다. 예를 들어 A와 B의 2 개 항목이 있고 B가 A의 하위 항목이라고 가정 해보십시오. A를 삭제하면 B가 자동으로 삭제됩니다. 그런 다음 B에 가서 삭제하려고합니다. 팔!

이 할 수있는 안전한 방법은 항목이 최상위 레벨 일 경우, 테스트하는 것입니다 즉, 그것은 부모가 없습니다 :

QList<QGraphicsItem*> all = items(); 
for (int i = 0; i < all.size(); i++) 
{ 
    QGraphicsItem *gi = all[i]; 
    if(gi->parentItem()==NULL) { 
     delete gi; 
    } 
} 
관련 문제