我在这里阅读 Qt 文档。我在标题“线程亲和力”下找到了以下句子。
注意:QObject 的成员变量不会自动成为它的子变量。必须通过将指针传递给子构造函数或调用 setParent() 来设置父子关系。
我不明白它提到的对象与其成员变量之间的设置父子关系。我只知道超类和子类的父子关系。
谁能给我解释一下这句话?如果你能提供一个例子,它会更有帮助。
谢谢阅读。
我在这里阅读 Qt 文档。我在标题“线程亲和力”下找到了以下句子。
注意:QObject 的成员变量不会自动成为它的子变量。必须通过将指针传递给子构造函数或调用 setParent() 来设置父子关系。
我不明白它提到的对象与其成员变量之间的设置父子关系。我只知道超类和子类的父子关系。
谁能给我解释一下这句话?如果你能提供一个例子,它会更有帮助。
谢谢阅读。
如果没有显式设置属性,成员变量将不会成为子对象。parent
子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;
}
AQObject
是一个对象容器。它包含的对象称为其子对象,包含对象被认为是这些子对象的父对象。这本身并没有说明孩子的分配方式和方式。让我们看一下 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()
函数演示了一个对象如何成为某些具有自动和动态存储持续时间的子项的父项。父对象可以在构造函数中给出,也可以作为setParent
方法的参数。
该类Parent
演示了成员对象可以是父类的子对象,但不一定如此。成员值具有自动存储持续时间,但并非所有子对象都是。指向的对象aChild6
是动态存储期限。由于QObject
删除了其析构函数中的所有子对象,因此对象的有效存储持续时间aChild6
是自动的:您不必担心必须删除对象。