我正在閱讀Qt文檔here。我在「線索相關性」標題下找到了以下句子。親子關係設置爲Qt中的成員變量
注意:一個QObject的成員變量不會自動成爲其子元素。父子關係必須通過傳遞指向子構造函數的指針或調用setParent()來設置。
我不明白它提到的設置對象和它的成員變量之間的父子關係。我只知道超類和子類之間的父子關係。
任何人都可以向我解釋這句話嗎?如果你能提供一個例子,它會更有幫助。
感謝您的閱讀。
我正在閱讀Qt文檔here。我在「線索相關性」標題下找到了以下句子。親子關係設置爲Qt中的成員變量
注意:一個QObject的成員變量不會自動成爲其子元素。父子關係必須通過傳遞指向子構造函數的指針或調用setParent()來設置。
我不明白它提到的設置對象和它的成員變量之間的父子關係。我只知道超類和子類之間的父子關係。
任何人都可以向我解釋這句話嗎?如果你能提供一個例子,它會更有幫助。
感謝您的閱讀。
成員變量將不是成爲子對象而沒有明確設置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;
}
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
處的有效存儲持續時間是自動的:您不必擔心必須刪除該對象。
謝謝大家。我要加上那個音符的最後一句話。 「如果沒有這一步,當moveToThread()被調用時,對象的成員變量將保留在舊線程中。」這意味着如果對象移動到不同的線程,它不能訪問它的成員變量。我的意思是失去了價值。對? –
@HareenLaks如果發生這種情況,您可以訪問成員變量,但這樣做不再是線程安全的。 –