2013-04-22 55 views
0

我試圖用QObject樹刪除機制來刪除存儲在列表中的列表和所有QObject。 Qt仍然是我本週的區域...QObject將QList設置爲父級使用setParent()

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

我在最後一行得到了「分段錯誤」。 QList不能作爲父母使用嗎?它不是從QObject繼承嗎?

編輯

主要的問題 - 是它可以方便刪除列表,無需擴展QList類的所有列表元素?這需要由客戶調用,因此它必須簡單。

我想簡單地調用:

delete list; 

,而不是

qDeleteAll(list); 
delete list; 
+0

最大的問題是你爲什麼動態分配整個列表。爲什麼它不只是一個''QList list''? – 2013-04-22 09:38:12

+0

不可能與QList - 你可以使用QSharedPointer。 – 2013-04-22 11:31:54

回答

1

QList號不從QObject繼承。如果您想要輕鬆刪除列表中的內容,則可以使用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 2013-04-22 09:22:03

+0

@Remi實際上它回答了他們兩個,但是然後你將你的問題編輯成完全不同的東西。 – cmannett85 2013-04-22 09:23:18

+0

這是真的 - 對不起,我在你的答案後延長了這個問題。 – Remi 2013-04-22 09:28:43

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 2013-04-22 09:22:54

+0

我認爲您提出的「刪除列表」並不是一個好方法,我相信如果在某個模塊中分配了某些內容,它應該在此處被釋放。再次,你不'需要一個QList _at_all_ QObject維護兒童列表本身 – evilruff 2013-04-22 09:26:23

+0

這個模型是非常簡化的。我需要在e模塊中創建對象,然後使用它們並在完全不同的位置刪除。 – Remi 2013-04-22 09:31:05

相關問題