【问题标题】:QSystemTrayIcon in 4.8 - how to delete this thing?QSystemTrayIcon in 4.8 - 如何删除这个东西?
【发布时间】:2014-05-09 01:00:42
【问题描述】:

正如标题所说,这是什么东西,我该如何处理?

这是一个QObject,并要求QObject 作为它的父级。但同时它的子对象显然是QWidgets

通常使用QObjects,您可以在删除父级时让父级删除它,也可以自己删除它。但是QSystemTrayIcon 似乎并没有以这种方式工作-我尝试将其设为任意 QObject 的子级,然后让它的父级删除它-当我这样做时,一个挥之不去的事件被发送到已成为父级的 QSystemTrayIcon-删除。在 OSX 上,这会出现段错误,因为它最终会向无效对象发送 obj 消息。

这可能是因为 QMainWindow 在我的应用程序中同时消失了。

如果我必须在取消子节点后显式删除它,为什么?如果是这样的话,听起来这取决于时间或其他东西。

如果QSystemTrayIcon 真的只是想要一个QWidget 作为它的父级,为什么它的构造函数不是这样写的呢?

【问题讨论】:

  • 您是否尝试使用deleteLater() 而不是delete?这应该有助于确保在删除 QSystemTrayIcon 之前传递所有适当的事件。

标签: c++ qt qwidget qmainwindow qobject


【解决方案1】:

以下方法有效:

  • QApplication 子类
  • 如果需要,将 QSystemTrayIcon 实例设为应用实例的子实例
  • 创建首先删除托盘的自定义应用析构函数

Tray 内部使用 QWidget,当 QApplication 实例已经销毁时,它的删除工作不正确。

【讨论】:

    【解决方案2】:

    就是这样

    trayIcon->setVisible(false);
    exit(0);
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    猜你喜欢
    • 2020-01-22
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2018-07-07
    相关资源
    最近更新 更多