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

时间:2015-09-17 08:34:23

标签: c++ qt member-variables

我正在阅读Qt文档here。我在“线程亲和力”标题下找到了以下句子。

  

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

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

任何人都可以向我解释这句话吗?如果你能提供一个例子,它会更有帮助。

感谢阅读。

3 个答案:

答案 0 :(得分:1)

QObject(A)可以将其他QObject(B)作为成员变量。 B不是自动创建的,A是其父级,而不是必须的。这是可能的,但不是必需的,也不是自动完成

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

请参阅文档here以及有关内存管理的问题答案here

答案 1 :(得分:1)

成员变量将 NOT 成为子对象而不显式设置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;
}

答案 2 :(得分:1)

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处对象的有效存储持续时间是自动的:您不必担心必须删除该对象。