8

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

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

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

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

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

4

2 回答 2

9

因此,您不需要父母。

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

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

以下摘自文档

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

于 2013-05-28T06:13:12.590 回答
1


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

文档

一个 QEvent::ThreadChange 事件在线程亲和性改变之前被发送到这个对象。您可以处理此事件以执行任何特殊处理。请注意,发布到此对象的任何新事件都将在 targetThread 中处理。

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

文档

一个 QEvent::ThreadChange 事件在线程亲和性改变之前被发送到这个对象。您可以处理此事件以执行任何特殊处理。请注意,发布到此对象的任何新事件都将在 targetThread 中处理。

于 2014-10-10T11:35:40.293 回答