如何防止在 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 Tooltip如何防止文本在内置延迟后消失?

如何使用 Qt 防止 QCursor::setPos() 上的 mouseMoveEvent?

如何防止用户使用 Python 和 Qt 在 QtableWidget 中移动列的大小?

如何使用 Qt Network 类防止关闭竞争条件

如何防止 Android 设备从 Qt 应用程序进入睡眠状态