Как развернуть приложение из трея 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())


