2

我有一个日志接口,允许用户继承 aLogger并覆盖log()虚函数,以便用户可以创建自己的记录器。有一个管理器跟踪所有已注册的日志记录方法(即控制台、系统日志、小部件等)

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

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

如何防止特定的 QObject 在 期间被破坏deleteChildren()?这是个坏主意吗?

4

1 回答 1

6

您不能将孩子排除在删除之外,如果可以,那将是一个坏主意。在 QObject 层次结构中,子对象归父对象所有。这是父子关系的主要目的之一。我不明白为什么你应该想要一个没有删除的父子关系。

可能性:

  1. 使其成为日志管理器的子项
  2. 根本不要给它父母,让日志管理器删除它
  3. 根本不要给它一个父级并使用 QSharedPointer/std::shared_ptr (后者在 C++11 中),通过使用 QSharedPointer 实例 int mainwindow 和记录器来管理它。

在不知道代码的情况下,我会说主窗口不应该与记录器混淆,所以我会将所有权完全转移给经理。

另外,我看不出为什么通常的 Logger 接口应该从 QObject 继承,所以我会考虑完全删除该继承(这留下了“仅由 Logging manager 拥有”和 QSharedPointer 选项)。

于 2011-11-29T19:16:22.567 回答