0

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

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

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

谁能给我解释一下这句话?如果你能提供一个例子,它会更有帮助。

谢谢阅读。

4

3 回答 3

1

QObject ( A) 可以有其他 QObject ( B's) 作为成员变量。's 不会与它们的父B级一起自动创建,A也不必如此。这是可能的,但不是必需的,也不是自动完成的。

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

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

于 2015-09-17T08:36:43.893 回答
1

如果没有显式设置属性,成员变量将不会成为子对象。parentObject类通常将另一个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;
}
于 2015-09-17T09:24:19.060 回答
1

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是自动的:您不必担心必须删除对象。

于 2015-09-17T12:43:39.260 回答