Qt app не может создать иконку в трее при запуске при запуске - PullRequest
4 голосов
/ 13 марта 2011

На самом деле нет проблем с моим кодом как таковым, но если я добавлю свою программу для запуска при запуске (т.е. каждый раз, когда пользователь входит в систему), она не сможет создать иконку в трее, потому что во время попытки панель задач еще не создана / инициализирована полностью. Есть ли решение для этого? Сейчас я думаю о чем-то вроде повторения 10 раз с 10-секундным интервалом.

Ответы [ 3 ]

4 голосов
/ 13 марта 2011

Это, безусловно, состояние гонки. Повторная попытка - это хорошая идея, но я бы сделал это с задержками. Запустите приложение, но используйте QTimer :: singleShot (), чтобы отложить на 5 секунд (или что-то еще), прежде чем пытаться подключиться к панели задач. Если вы хотите повторить попытку после этого (что, вероятно, является хорошей идеей), откладывайте дольше (поскольку немедленная повторная попытка, скорее всего, также не будет успешной, так как повторная попытка произойдет слишком быстро).

2 голосов
/ 13 февраля 2012

Цитата из http://developer.qt.nokia.com/doc/qt-4.8/qsystemtrayicon.html (обратите внимание на второй абзац):

"Чтобы проверить, присутствует ли системный трей на рабочем столе пользователя, вызовите статическую функцию QSystemTrayIcon :: isSystemTrayAvailable ()." ...

"Если системный трей недоступен при создании иконки в системном трее, но становится доступным позже, QSystemTrayIcon автоматически добавит запись для приложения в системный трей, если значок виден."

1 голос
/ 11 июля 2017

Мока правильно, он должен работать в соответствии с документами.Однако это не связано с ошибкой 61898 в Qt.

Обходной путь - дождаться, пока системный трей будет доступен с помощью isSystemTrayAvailable().Как Уэс Хардакер предлагает , вы можете попробовать каждые несколько секунд, используя 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 и до того, как отображается значок вашего состояния.

Редактировать : в соответствии с багтрекер , это было исправлено в 5.12.4.

...