我有一个日志记录界面,允许用户子类化Logger
并覆盖log()
虚函数,以便用户可以创建自己的记录器。有一个管理器可以跟踪所有已注册的日志记录方法(即Console,syslog,Widget等)
我创建了一个显示日志的QListWidget Logger。不幸的是,它由日志记录管理器拥有,因为它是一个QObject,它也是MainWindow的一个孩子。这导致两个对象试图在应用程序关闭时删除它。
QObjects->deleteChildren()
第一次被调用并删除它。然后Loggin gmanager再次尝试和CRASH。
如何在deleteChildren()
期间阻止特定QObject被销毁?这是个坏主意吗?
答案 0 :(得分:5)
你不能将孩子排除在删除之外,如果可以的话,这不是一个好主意。在QObject层次结构中,子项由父项拥有。这是亲子关系的主要目的之一。我不明白你为什么要在没有删除的情况下想要亲子关系。
的可能性:
在不知道代码的情况下,我会说主窗口不应该弄乱记录器,所以我会将所有权完全移交给经理。
另外,我没有看到通常的Logger接口应该从QObject继承的原因,所以我考虑完全删除该继承(留下“仅由Logging manager拥有”和QSharedPointer选项)。 / p>