2011-11-29 27 views
1

我有一个日志界面,允许用户对Logger进行子类化并覆盖log()虚拟功能,以便用户可以创建自己的记录器。有一位经理跟踪所有注册的日志记录方法(即控制台,系统日志,Widget等)如何防止在QT中的deleteChildren()过程中删除子项?

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

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

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

回答

4

你不能排除一个孩子从删除,如果你可以,这是一个坏主意。在QObject层次结构中,子级由父级拥有。这是亲子关系的主要目的之一。我不明白为什么你应该想要一个没有删除的亲子关系。

可能性:

  1. 让它日志管理器的孩子
  2. 不要给它一个家长都让日志管理器中删除它
  3. 不要给它一个家长在所有并使用QSharedPointer/std :: shared_ptr(后者在C++ 11中),通过使用QSharedPointer实例int mainwindow和logger来管理它。

不知道代码,我会说主窗口不应该混淆记录器,所以我会将所有权完全移到经理。另外,我没有看到为什么通常的Logger接口应该从QObject继承的原因,所以我会考虑彻底删除该继承(这留下了“仅由Logging manager拥有”和QSharedPointer选项)。

+0

我在尝试推荐#3,因为我认为这可能是最好的选择。虽然这是我第一次进入QSharedPointer,所以*手指交叉*。 – shadowland