4

我的代码本身实际上没有问题,但是如果我添加我的程序以在启动时运行(即每次用户登录时),它就无法创建托盘图标,因为在它尝试创建任务栏时尚未完全创建/初始化。有解决方案吗?现在我正在考虑以 10 秒的间隔重试 10 次。

4

3 回答 3

4

这当然是一种竞争条件。重试是个好主意,是的,但我会延迟。启动应用程序,但在尝试连接任务栏之前使用 QTimer::singleShot() 延迟 5 秒(或其他任何时间)。如果您想在那之后重试(这可能是一个好主意),请延迟更长的时间(因为立即重试可能不会成功,因为重试会发生得太快)。

于 2011-03-13T17:01:47.920 回答
2

引自http://developer.qt.nokia.com/doc/qt-4.8/qsystemtrayicon.html(注意第二段):

“要检查用户桌面上是否存在系统托盘,请调用 QSystemTrayIcon::isSystemTrayAvailable() 静态函数。” ...

“如果在构建系统托盘图标时系统托盘不可用,但稍后可用,如果图标可见,QSystemTrayIcon 将自动在系统托盘中添加应用程序条目。”

于 2012-02-13T07:26:57.630 回答
2

Moca是对的,它应该按照文档工作。但是,这不是由于 Qt 中的错误 61898

一种解决方法是等待系统托盘可用,使用isSystemTrayAvailable(). 正如Wes Hardaker 建议的那样,您可以每隔几秒钟尝试使用 a QTimer::singleShot(),直到系统托盘可用为止。

请注意,如果您show()的托盘图标一旦系统托盘可用,即使系统托盘被删除并创建了一个新托盘(如文档所述),它也将始终再次显示,因此您只需要第一次将其正确时间。

我正在使用 PyQt5,我替换了

self.show()

self._show_when_systray_available()

def _show_when_systray_available(self):
    """Show status icon when system tray is available 

    If available, show icon, otherwise, set a timer to check back later.
    This is a workaround for https://bugreports.qt.io/browse/QTBUG-61898
    """
    if self.isSystemTrayAvailable():
        self.show()
    else:
        QtCore.QTimer.singleShot(1000, self._show_when_systray_available)

我只能看到一个(非常不可能的)失败案例:一种竞争条件,即系统托盘在isSystemTrayAvailable()返回后true和状态图标显示之前的一小段时间内被移除。

编辑:根据 bugtracker 这已在 5.12.4 中修复。

于 2017-07-11T20:30:02.087 回答