2013-01-21 4 views
3

QGraphicsItem을 상속받은 사용자 지정 항목이 있습니다. 일부 하위 그래픽 항목이 멤버 변수로 있습니다. 장면에서 이러한 항목을 제거해야하는 순서와 삭제 방법은 무엇입니까?일부 하위 항목을 구성원으로 갖는 QGraphicsItem을 삭제하는 방법은 무엇입니까?

+1

회원으로 추가한다고해서 Qt가이 관계를 정의한다는 의미에서 * 어린이 *라는 것을 의미하지 않습니다. 당신은 생성자에서 또는 나중에 childItem-> setParent (this)를 사용하여 children 항목 (즉, 자신 ('this'))에 * parent *를 설정해야합니다. – leemes

+0

이 변수는 멤버 변수이며 기본 항목을 부모로 사용합니다. –

+0

그러면 모든 것이 좋습니다. 그러나이 의견은 미래의 독자들에게 중요 할 수 있습니다. 실수는 쉽게 할 수 있기 때문입니다. – leemes

답변

5

은 다음과 같이 귀하의 회원 그래픽 항목을 만들기 :이 경우

class MyClass : public QGraphicsItem 
{ 
    ... 
private: 

    SomeKindOfGraphicsItem* _item1; 
    SomeOtherGraphicsItem* _item2; 
} 

MyClass::MyClass(...) : 
    QGraphicsItem(...), 
    _item1(new SomeKindOfGraphicsItem(..., this)), 
    _item2(new SomeOtherGraphicsItem(..., this)) 
{ 
    ... 
} 

, 현장에서 오직 상위 항목 (이 예에서는 MyClass)를 제거하기에 충분하다. 이뿐만 아니라 모든 하위 항목을 제거합니다

무효 QGraphicsScene :: removeItem (QGraphicsItem * 항목)

항목 항목과 현장에서 모든 아이를 삭제합니다. 항목의 소유권이 발신자에게 전달됩니다 (예 : QGraphicsScene은 더 이상 삭제할 때 항목을 삭제하지 않습니다). MyClass의 객체가 삭제됩니다 때 또한

, 그것은 Qt 역학을 통해 아이들이 모두 삭제됩니다

QGraphicsItem :: ~

파괴한다 [가상] QGraphicsItem() QGraphicsItem과 그 모든 자식들. 이 항목이 현재 장면과 연관되어 있으면 항목이 삭제되기 전에 장면에서 제거됩니다.

참고 : 항목을 삭제하기 전에 QGraphicsScene에서 항목을 제거하는 것이 더 효율적입니다.

+0

소멸자에서 하위 항목을 삭제해야합니까? 그것은 실제로 문제를 일으켰을 수도 있습니다. –

+2

@ fatma.ekici 아니요, 자동으로 발생합니다. 실제로, 만약 수동으로한다면, 프로그램을 망칠 더블 삭제 *가 생깁니다! 그런데 위젯 유형과 다른 QObject 유형도 마찬가지입니다. 그들은 모두 나무 *를 형성합니다. 트리에서 노드를 삭제하면 모든 자식이 * 재귀 적으로 삭제됩니다. 이 프로세스는 Qt에 의해 자동으로 수행됩니다. 부모가 생성자 (이 답변의 코드에있는 멤버 이니셜 라이저 목록의 'this')를 키로 전달하여 트리에 있음을주의해야합니다. – leemes

+0

주 항목의 소멸자에있는 하위 항목은 삭제하지 않습니다. 그러나 mainItem을 장면에서 제거한 후 delete를 호출하면 프로그램이 중단됩니다. –

관련 문제