如何防止在Qt中的deleteChildren()期间删除子项?

时间:2011-11-29 18:53:23

标签: qt qobject virtual-destructor

我有一个日志记录界面,允许用户子类化Logger并覆盖log()虚函数,以便用户可以创建自己的记录器。有一个管理器可以跟踪所有已注册的日志记录方法(即Console,syslog,Widget等)

我创建了一个显示日志的QListWidget Logger。不幸的是,它由日志记录管理器拥有,因为它是一个QObject,它也是MainWindow的一个孩子。这导致两个对象试图在应用程序关闭时删除它。

QObjects->deleteChildren()第一次被调用并删除它。然后Loggin gmanager再次尝试和CRASH。

如何在deleteChildren()期间阻止特定QObject被销毁?这是个坏主意吗?

1 个答案:

答案 0 :(得分:5)

你不能将孩子排除在删除之外,如果可以的话,这不是一个好主意。在QObject层次结构中,子项由父项拥有。这是亲子关系的主要目的之一。我不明白你为什么要在没有删除的情况下想要亲子关系。

的可能性:

  1. 让它成为日志管理员的孩子
  2. 根本不要给它父母,让日志管理员删除它
  3. 不要给它一个父项并使用QSharedPointer / std :: shared_ptr(后者在C ++ 11中),使用QSharedPointer实例int mainwindow和logger来管理它。
  4. 在不知道代码的情况下,我会说主窗口不应该弄乱记录器,所以我会将所有权完全移交给经理。

    另外,我没有看到通常的Logger接口应该从QObject继承的原因,所以我考虑完全删除该继承(留下“仅由Logging manager拥有”和QSharedPointer选项)。 / p>