2013-04-22 4 views
0

QObject 트리 삭제 메커니즘을 사용하여 목록을 삭제하고 목록에 저장된 QObject 개를 모두 사용하려고합니다. Qt는 여전히 내 주간 지역입니다 ...QObject setParent()를 사용하여 QList를 부모로 설정했습니다.

QList<QObject*>* list = new QList<QObject*>(); 
QObject* obj1 = new QObject(); 
QObject* obj2 = new QObject(); 
obj1->setParent(obj2); 
obj2->setParent((QObject*)list); 

마지막 줄에는 "Segmentation fault"가 있습니다. QList을 부모로 사용할 수 없습니까? QObject에서 상속되지 않습니까?

편집 :

주요 질문 -가 편리 목록 및 QList 클래스를 확장하지 않고 모든 목록 요소를 삭제할 수 있습니까? 이것은 클라이언트가 간단하게 호출해야합니다.

단순히 전화 싶습니다

delete list; 

QObject에서하지

qDeleteAll(list); 
delete list; 
+0

가장 큰 질문은 동적으로 전체 목록을 할당하는 이유입니다. 왜''QList list''가 아닌가? –

+0

QList 에서는 불가능합니다. QSharedPointer를 사용할 수도 있습니다. –

답변

1

번호 QList을 상속하지 않습니다. 목록의 내용을 쉽게 삭제하려면 qDeleteAll(list)을 사용할 수 있습니다.

편집 : 이것은 테스트되지 않았으며 가상 소멸자가없는 기본 클래스에서 문제가있을 수 있습니다.

template < class T > 
class MyList : public QList<T> 
{ 
    static_assert(std::is_pointer<T>::value, 
        "T must be a pointer."); 
    // Constructors... 
    ... 
    virtual ~MyList() { qDeleteAll(*this); } 
} 
+0

그게 많은 설명 -하지만 여전히 내 질문에 대답하지 않습니다. – Remi

+0

@Remi 실제로 두 사람 모두에게 답변했지만, 질문을 완전히 다른 것으로 편집했습니다. – cmannett85

+0

사실입니다. 죄송합니다. 답변을 마친 후에 미안합니다. – Remi

0

옵션 1)

QList<QObject*> list; 

.. somewhere in the code 

QObject * obj = new QObject(); 
list << obj; 

... 

then 


onDelete() { // variant 1 
     QObject * ptr; 
     foreach(ptr, list) { 
      delete ptr; 
     } 
     list(clear); 
} 

onDelete() { // variant 2 
    qDeleteAll(list); 
} 

옵션 2)

QObject * parent = new QObject(); 

somewhere in a code 
... 
QObject * child1 = new QObject(parent); 
QObject * child2 = new QObject(parent); 


onDelete() { 
    delete parent; // all children deleted automatically 
} 

UPD :

질문 업데이트에서

, 난 당신이 전혀 QList하지 않는 것을 고려할 수있다, 그냥 QObject가 제공 한 기능을 사용하고, 어린이가 필요할 경우 적절한 childer() 메소드를 사용하면 QList를 얻을 수있다

+0

클라이언트 측에서이 작업을 수행하는 것이 편리하지 않습니다. – Remi

+0

'목록 삭제'는 좋은 접근 방식이 아니라고 생각합니다. 특정 모듈 내에 할당 된 항목이 있으면 free'd라고 생각합니다. 그리고 다시, 당신은 QList가 필요 없습니다. _at_all_ QObject는 자체 자식리스트를 유지합니다 – evilruff

+0

이 모델은 매우 단순합니다. 나는 e 모듈 이상에서 객체를 생성하고 완전히 다른 장소에서 삭제하고 삭제할 필요가있다. – Remi