2015-09-17 59 views
0

我正在閱讀Qt文檔here。我在「線索相關性」標題下找到了以下句子。親子關係設置爲Qt中的成員變量

注意:一個QObject的成員變量不會自動成爲其子元素。父子關係必須通過傳遞指向子構造函數的指針或調用setParent()來設置。

我不明白它提到的設置對象和它的成員變量之間的父子關係。我只知道超類和子類之間的父子關係。

任何人都可以向我解釋這句話嗎?如果你能提供一個例子,它會更有幫助。

感謝您的閱讀。

回答

1

成員變量將不是成爲子對象而沒有明確設置parent屬性。 A Object子類通常需要另一個QObject,因爲它是構造函數中的父類。

class Test : public QObject 
{ 
    Q_OBJECT 
    public: 
    Test(QObject* prnt) 
     : QObject(prnt), 
     timerNoPrnt(), // Test object is NOT the parent. This won't be deleted when Test object gets deleted. 
     timer(this) // Test object is the parent here. This will be deleted when Test object gets deleted. 
    { 
     timerNoPrnt->setParent(this); // now parent assigned. 
    } 
    private: 
    QTimer*   timerNoPrnt; // member variable 
    QTimer*   timer; 
} 
+0

謝謝大家。我要加上那個音符的最後一句話。 「如果沒有這一步,當moveToThread()被調用時,對象的成員變量將保留在舊線程中。」這意味着如果對象移動到不同的線程,它不能訪問它的成員變量。我的意思是失去了價值。對? –

+1

@HareenLaks如果發生這種情況,您可以訪問成員變量,但這樣做不再是線程安全的。 –

1

QObject(A)可以有其他QObject(B's)作爲成員變量。 B的不是自動創建的,並且A是他們的父母,不一定是。這是可能的,但不是必要的也不能自動完成。

不僅有一個類和它的超級類(基類)之間的父子關係,而且在QWidget和嵌入的小部件之間也存在父子關係。它用於例如最終以正確的順序銷燬小部件。

請參閱文檔here以及SO關於內存管理here的答案。

1

A QObject是一個對象容器。它包含的對象稱爲它的子對象,包含的對象被認爲是這些子對象的父對象。這本身並沒有說明如何分配兒童。讓我們來看看在某些情況下,在C++ 11:

void test() { 
    QObject aParent; 
    // children of automatic storage duration 
    QObject aChild1{&aParent}, aChild2; 
    aChild2->setParent(&aParent); 
    // children of dynamic storage duration 
    auto aChild3 = new QObject{&aParent}; 
    auto aChild4 = new QObject; 
    aChild4->setParent(&aParent); 
} 

struct Parent : QObject { 
    QObject aChild5 { this }; 
    QObject * aChild6 { new QObject }; 
    QObject notAChild; 
    Parent() { aChild6->setParent(this); } 
}; 

test()功能演示了一個對象如何是父母自動和動態存儲時間的一些孩子。父對象可以在構造函數中給出,也可以作爲方法的參數給出。

Parent類表明成員對象可以是父類的子對象,但不一定如此。成員值是自動存儲持續時間,但並非所有子對象都是。 aChild6指向的對象具有動態存儲持續時間。由於QObject會刪除其析構函數中的所有子項,因此對象在aChild6處的有效存儲持續時間是自動的:您不必擔心必須刪除該對象。