我正在编写一些源自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)或者根本没有,那有什么区别?
答案 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中处理。