Как развернуть приложение из трея PyQt6 по нажатию ЛКМ?

У меня есть приложение, которое при необходимости сворачивается в трей.
Мне нужно, чтобы при нажатии левой кнопки мыши приложение разворачивалось из трея.

main.py:

from PyQt6.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QCheckBox, QSystemTrayIcon, QMenu, QStyle
from PyQt6.QtGui import QAction
from PyQt6.QtCore import QEvent


class MainWindow(QWidget):

    check_box = None
    tray_icon = None

    def __init__(self):
        super().__init__()

        layout = QVBoxLayout(self)
        self.setLayout(layout)
        layout.addWidget(QLabel("Application, which can minimize to Tray", self))

        self.check_box = QCheckBox('Minimize to Tray')
        layout.addWidget(self.check_box, 1)

        self.tray_icon = QSystemTrayIcon(self)
        self.tray_icon.setIcon(self.style().standardIcon(QStyle.StandardPixmap.SP_DialogYesButton))

        show_action = QAction("Show", self)
        quit_action = QAction("Exit", self)
        hide_action = QAction("Hide", self)
        show_action.triggered.connect(self.show)
        hide_action.triggered.connect(self.hide)
        quit_action.triggered.connect(QApplication.quit)
        tray_menu = QMenu()
        tray_menu.addAction(show_action)
        tray_menu.addAction(hide_action)
        tray_menu.addAction(quit_action)
        self.tray_icon.setContextMenu(tray_menu)
        self.tray_icon.show()
        # self.show()
        # self.tray_icon.event(QEvent.Type.MouseButtonPress)
        # self.tray_icon.activated()


    def closeEvent(self, event):
        if self.check_box.isChecked():
            event.ignore()
            self.hide()
            self.tray_icon.showMessage("Tray Program", "Application was minimized to Tray",
                                       QSystemTrayIcon.MessageIcon.NoIcon, 2000)


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec())

Ответы (1 шт):

Автор решения: S. Nick

Я не совсем уверен что правильно понял вас.

void QSystemTrayIcon::activated(QSystemTrayIcon::ActivationReason reason)

Этот сигнал испускается, когда пользователь активирует значок на панели задач.
reason указывает причину активации.
QSystemTrayIcon::ActivationReason перечисляет различные причины.

'''
from PyQt6.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, \
    QCheckBox, QSystemTrayIcon, QMenu, QStyle
from PyQt6.QtGui import QAction
from PyQt6.QtCore import QEvent
'''
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class MainWindow(QWidget):
# ???    check_box = None
# ???    tray_icon = None

    def __init__(self):
        super().__init__()

        label = QLabel("Приложение, которое можно свернуть в трей", self)
        self.check_box = QCheckBox('Свернуть в трей')

# или так:
        layout = QVBoxLayout(self)
# или так:
#        layout = QVBoxLayout()
#        self.setLayout(layout)

        layout.addWidget(label)
        layout.addWidget(self.check_box, 1)

        self.tray_icon = QSystemTrayIcon(self)
        self.tray_icon.setIcon(self.style().standardIcon(
            QStyle.StandardPixmap.SP_DialogYesButton))
# +++            
        self.tray_icon.activated.connect(self.restore_window)          # +++

        show_action = QAction("Show", self)
        show_action.triggered.connect(self.show)
        
        quit_action = QAction("Exit", self)
        quit_action.triggered.connect(QApplication.quit)
        
        hide_action = QAction("Hide", self)
        hide_action.triggered.connect(self.hide)

        tray_menu = QMenu()
        tray_menu.addAction(show_action)
        tray_menu.addAction(hide_action)
        tray_menu.addAction(quit_action)
        self.tray_icon.setContextMenu(tray_menu)
        self.tray_icon.show()

    def closeEvent(self, event):
        if self.check_box.isChecked():
            event.ignore()
            self.hide()
            self.tray_icon.showMessage(
                "Tray Program", 
                "Application was minimized to Tray",
                QSystemTrayIcon.MessageIcon.NoIcon, 
                2000
            )

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    def restore_window(self, reason):
        if reason == QSystemTrayIcon.Trigger:              # ЛКМ
            self.tray_icon.show()        
            self.showNormal()
        elif reason == QSystemTrayIcon.MiddleClick:
            self.tray_icon.show()        
            self.hide()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            

if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec())

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка