如何防止在 Qt 中的 deleteChildren() 期间删除孩子?
Posted
技术标签:
【中文标题】如何防止在 Qt 中的 deleteChildren() 期间删除孩子?【英文标题】:How to prevent a child from being deleted during deleteChildren() in Qt? 【发布时间】:2011-11-29 18:53:22 【问题描述】:我有一个日志接口,允许用户继承Logger
并覆盖log()
虚函数,以便用户可以创建自己的记录器。有一个管理器跟踪所有已注册的日志记录方法(即控制台、系统日志、小部件等)
我创建了一个显示日志的 QListWidget Logger。不幸的是,它归日志管理器所有,因为它是一个 QObject,它也是 MainWindow 的子窗口。这导致两个对象试图在应用程序关闭时将其删除。
QObjects->deleteChildren()
第一次被调用并删除它。然后 Loggin gmanager 再次尝试并 CRASH。
如何防止特定的 QObject 在deleteChildren()
期间被破坏?这是个坏主意吗?
【问题讨论】:
【参考方案1】:您不能将孩子排除在删除之外,如果可以的话,那是个坏主意。在 QObject 层次结构中,子对象归父对象所有。这是父子关系的主要目的之一。我不明白为什么你应该想要一个没有删除的父子关系。
可能性:
-
使其成为日志管理器的子项
根本不给它父母,让日志管理器删除它
根本不给它一个父对象,而是使用 QSharedPointer/std::shared_ptr(后者在 C++11 中),通过使用 QSharedPointer 实例 int mainwindow 和 logger 来管理它。
在不知道代码的情况下,我会说主窗口不应该与记录器混淆,所以我会将所有权完全转移给经理。
另外,我看不出为什么通常的 Logger 接口应该从 QObject 继承,所以我会考虑完全删除该继承(留下“仅由 Logging manager 拥有”和 QSharedPointer 选项)。
【讨论】:
我正在尝试建议 #3,因为我认为这可能是最好的选择。虽然这是我第一次尝试 QSharedPointer,所以手指交叉。以上是关于如何防止在 Qt 中的 deleteChildren() 期间删除孩子?的主要内容,如果未能解决你的问题,请参考以下文章
Qt Installer Framework - 防止安装在非空文件夹中
如何使用 Qt 防止 QCursor::setPos() 上的 mouseMoveEvent?