QObject派生类型需要一个父QObject吗?

8

我正在编写一些继承自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个回答

9

因此,您不需要父对象。

但是设置父对象在垃圾回收方面有一些优势。

如果您设置了一个父对象,则当父对象被删除时,它也将删除所有其子对象。

下面是来自文档的摘录:

QObjects以对象树的形式组织。当您使用另一个对象作为父对象创建QObject时,该对象会自动添加到父对象的children()列表中。父对象拥有该对象;即,它将在其析构函数中自动删除其子项。您可以使用findChild()或findChildren()通过名称和可选类型查找对象。


1
如果您想允许将包含类型为class A的成员的某些对象移动到另一个线程,则应允许设置父对象。
(您实际上无法防止这种情况发生。)在这种情况下,成员A可能也必须被移动。
docs中可以看到:

在线程亲和性更改之前,会向此对象发送QEvent :: ThreadChange事件。您可以处理此事件以执行任何特殊处理。请注意,任何新事件都将在目标线程中处理。

因此,如果不允许传递父项,则包含您类的对象的维护者将不得不覆盖event(),检查QEvent::ThreadChange并手动移动A。
docs中可以看到:
在线程关联性改变之前,会向该对象发送QEvent::ThreadChange事件。您可以处理此事件以执行任何特殊处理。请注意,任何发布到此对象的新事件都将在目标线程中处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接