QObject派生类型需要父QObject吗?

时间:2013-05-28 06:02:28

标签: c++ qt qobject

我正在编写一些源自QObject的Qt类,它看起来像是:

class A : public QObject
{
    Q_OBJECT
public: A() : QObject() {}
.....
}

但在我看到的几个地方,QObject派生类都有一个父类,如:

class A : public QObject
{
    Q_OBJECT
public: A(QObject* parent = 0) : QObject(parent) {}
.....
}

所以问题是:我是否需要父母?如果我有一个,如果我有一个默认的(0)或者根本没有,那有什么区别?

2 个答案:

答案 0 :(得分:8)

因此,您不需要父母。

但设置父级在垃圾收集方面有一些优势。

如果您设置了父级,那么当父级被删除时,它也会删除所有子级。

摘自doc

  

QObjects在对象树中组织自己。当您使用另一个对象作为父对象创建QObject时,该对象将自动将其自身添加到父对象的children()列表中。父母取得对象的所有权;即,它将自动删除其析构函数中的子项。您可以按名称查找对象,也可以使用findChild()或findChildren()进行键入。

答案 1 :(得分:1)

您应该允许设置父母 如果您想允许将包含class A类型成员的对象移动到另一个线程。
(你真的无法阻止。)
在这种情况下,成员A也可能必须被移动。

来自docs

  

在更改线程关联之前,将QEvent :: ThreadChange事件发送到此对象。您可以处理此事件以执行任何特殊处理。请注意,发布到此对象的任何新事件都将在targetThread中处理。

因此,如果您不允许传递父级,则包含您的类的对象的维护者必须覆盖event(),检查QEvent::ThreadChange并手动移动A.

来自docs

  

在更改线程关联之前,将QEvent :: ThreadChange事件发送到此对象。您可以处理此事件以执行任何特殊处理。请注意,发布到此对象的任何新事件都将在targetThread中处理。

相关问题