【问题标题】:How to prevent a child from being deleted during deleteChildren() in Qt?如何防止在 Qt 中的 deleteChildren() 期间删除孩子?
【发布时间】:2011-11-29 18:53:22
【问题描述】:

我有一个日志接口,允许用户继承Logger 并覆盖log() 虚函数,以便用户可以创建自己的记录器。有一个管理器跟踪所有已注册的日志记录方法(即控制台、系统日志、小部件等)

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

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

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

【问题讨论】:

    标签: qt qobject virtual-destructor


    【解决方案1】:

    您不能将孩子排除在删除之外,如果可以的话,那是个坏主意。在 QObject 层次结构中,子对象归父对象所有。这是父子关系的主要目的之一。我不明白为什么你应该想要一个没有删除的父子关系。

    可能性:

    1. 使其成为日志管理器的子项
    2. 根本不给它父母,让日志管理器删除它
    3. 根本不给它一个父对象,而是使用 QSharedPointer/std::shared_ptr(后者在 C++11 中),通过使用 QSharedPointer 实例 int mainwindow 和 logger 来管理它。

    在不知道代码的情况下,我会说主窗口不应该与记录器混淆,所以我会将所有权完全转移给经理。

    另外,我看不出为什么通常的 Logger 接口应该从 QObject 继承,所以我会考虑完全删除该继承(留下“仅由 Logging manager 拥有”和 QSharedPointer 选项)。

    【讨论】:

    • 我正在尝试建议 #3,因为我认为这可能是最好的选择。虽然这是我第一次尝试 QSharedPointer,所以手指交叉
    猜你喜欢
    • 2017-10-22
    • 2020-10-11
    • 2014-12-27
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多