gpt4 book ai didi

qt - 如何防止在 Qt 中的 deleteChildren() 期间删除 child ?

转载 作者:行者123 更新时间:2023-12-02 08:51:22 28 4
gpt4 key购买 nike

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

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

QObjects->deleteChildren() 第一次被调用并删除它。然后登录 gmanager 再次尝试并崩溃。

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

最佳答案

您不能将 child 排除在删除之外,如果可以,那将是个坏主意。在 QObject 层次结构中,子对象由父对象拥有。这是亲子关系的主要目的之一。我不明白你为什么要在没有删除的情况下建立父子关系。

可能性:

  1. 让它成为日志管理器的 child
  2. 根本不给它父级,让日志管理器删除它
  3. 根本不要给它一个父级并使用 QSharedPointer/std::shared_ptr(后者在 C++11 中),通过在主窗口和记录器中使用 QSharedPointer 实例来管理它。

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

此外,我完全看不出为什么通常的 Logger 接口(interface)应该从 QObject 继承的原因,所以我会考虑完全删除该继承(留下“仅由日志管理器拥有”和 QSharedPointer 选项)。

关于qt - 如何防止在 Qt 中的 deleteChildren() 期间删除 child ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8316129/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com