父子关系设置为Qt中的成员变量

Parent-child relationship set to member variables in Qt

本文关键字:成员 变量 Qt 设置 父子关系      更新时间:2023-10-16

我在这里阅读Qt文档。我在标题"线程亲和性"下发现了下面的句子。

注意:QObject的成员变量不会自动成为它的子变量。父-子关系必须通过传递给子类构造函数的指针或调用setParent()来设置。

我不明白它提到的设置对象和它的成员变量之间的父子关系。我只知道父类和子类之间的亲子关系。

谁能给我解释一下这个句子?如果你能举个例子就更有帮助了。

如果不显式设置parent属性,成员变量NOT将成为子对象。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;
}

一个QObject (A)可以有其他QObject (B)作为成员变量。B不会自动与A一起创建,也不必这样做。这是可能的,但不是必须的,也不是自动完成的。

不仅类和它的超类(基类)之间存在父子关系,而且QWidget和嵌入的小部件之间也存在父子关系。例如,它用于最终以正确的顺序销毁小部件。

请参阅此处的文档和关于内存管理的SO的答案。

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()函数演示了一个对象如何成为一些具有自动和动态存储持续时间的子对象的父对象。父对象可以在构造函数中给出,也可以作为setParent方法的参数给出。

Parent类说明成员对象可以是父类的子类,但不一定是。成员值具有自动存储持续时间,但并非所有子对象都具有。aChild6所指向的对象是动态存储持续时间。由于QObject删除其析构函数中的所有子对象,因此对象在aChild6的有效存储持续时间是自动的:您不必担心必须删除对象。