如何防止在QT中的deleteChildren()过程中删除子项?
问题描述:
我有一个日志界面,允许用户对Logger
进行子类化并覆盖log()
虚拟功能,以便用户可以创建自己的记录器。有一位经理跟踪所有注册的日志记录方法(即控制台,系统日志,Widget等)如何防止在QT中的deleteChildren()过程中删除子项?
我创建了一个显示日志的QListWidget Logger。不幸的是,它由日志记录管理器拥有,因为它是一个QObject,它也是MainWindow的子节点。这会导致两个对象试图在应用程序关闭时将其删除。
第一次围绕QObjects->deleteChildren()
被调用并删除它。然后Loggin gmanager再次尝试和CRASH。
如何防止在deleteChildren()
期间销毁特定的QObject?这是一个坏主意吗?
答
你不能排除一个孩子从删除,如果你可以,这是一个坏主意。在QObject层次结构中,子级由父级拥有。这是亲子关系的主要目的之一。我不明白为什么你应该想要一个没有删除的亲子关系。
可能性:
- 让它日志管理器的孩子
- 不要给它一个家长都让日志管理器中删除它
- 不要给它一个家长在所有并使用QSharedPointer/std :: shared_ptr(后者在C++ 11中),通过使用QSharedPointer实例int mainwindow和logger来管理它。
不知道代码,我会说主窗口不应该混淆记录器,所以我会将所有权完全移到经理。另外,我没有看到为什么通常的Logger接口应该从QObject继承的原因,所以我会考虑彻底删除该继承(这留下了“仅由Logging manager拥有”和QSharedPointer选项)。
我在尝试推荐#3,因为我认为这可能是最好的选择。虽然这是我第一次进入QSharedPointer,所以*手指交叉*。 – shadowland