【问题标题】:Do QObject derived types need a parent QObject?QObject 派生类型是否需要父 QObject?
【发布时间】:2013-05-28 06:02:28
【问题描述】:

我正在编写一些从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) 或我根本没有,有什么区别?

【问题讨论】:

    标签: c++ qt qobject


    【解决方案1】:

    因此,您不需要父母。

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

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

    以下摘自doc

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

    【讨论】:

      【解决方案2】:

      如果您想允许将包含class A 类型成员的某些对象移动到另一个线程,您应该允许设置父级

      (您无法真正预防。)
      在这种情况下,成员 A 可能也必须移动。

      来自docs

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

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

      来自docs

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

      【讨论】:

        猜你喜欢
        • 2020-03-04
        • 2013-11-20
        • 1970-01-01
        • 2015-05-20
        • 1970-01-01
        • 2010-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多