天天看點

PyQt5 生成托盤及托盤關閉bug解決PyQt5建立托盤

PyQt5建立托盤

問題描述:點選關閉叉叉按鈕或者托盤右鍵出來的Quit雖然程式已經結束了,但是托盤圖示還是會繼續停留在系統托盤中,直到滑鼠移到圖示上才會消失

解決方案

需要重寫退出事件,在程式結束前需要先将QSystemTrayIcon對象記憶體清空

使用到的包

  1. QtWidgets.Qwidget、QtWidgets.QsystemTrayIcon、QtWidgets.QMenu、QtWidgetsQAction、QtWidgets.QApplication
  2. QtGui.Qicon、QtGui.QColor、QtGui.QPixmap
  3. sys

步驟

  1. 建立PyQt基本套路
  2. 建立QSystemTrayIcon托盤對象
  3. 建立QIcon對象,将其設定為Tray(托盤)圖示
  4. 建立QMenu(菜單)對象,建立QAction(行為)對象,将QAction(行為)對象添加至QMenu(菜單)對象中,相當于綁定點選事件
  5. 将QMenu(菜單)對象設定到右鍵觸發(setContextMenu)事件中

代碼

from PyQt5.QtWidgets import QApplication, QWidget, QSystemTrayIcon, QAction, QMenu
from PyQt5.QtGui import QIcon, QPixmap, QColor
import sys

class TaryWiondw(QWidget):
    def __init__(self):
        super().__init__()
        # 建立托盤對象
        self.tray = QSystemTrayIcon()

        # 建立QIcon對象,用于設定圖示(圖檔過大會出錯)
        self.trayIconPix = QPixmap(16,16)
        self.trayIconPix.fill(QColor(100,100,100))
        self.Icon = QIcon(self.trayIconPix)

        # 設定托盤圖示(QIcon圖示過大或者出錯會導緻托盤顯示不出來)
        self.tray.setIcon(self.Icon)
        self.tray.setVisible(False)

        # 建立QAction
        showAction = QAction("&Show", self, triggered = self.Show)
        quitAction = QAction("&Quit", self, triggered = self.Exit)
        # 建立菜單對象
        self.trayMenu = QMenu(self)
        # 将動作對象添加到菜單
        self.trayMenu.addAction(showAction)
        # 增加分割線
        self.trayMenu.addSeparator()
        self.trayMenu.addAction(quitAction)
        # 将菜單欄加入到右鍵按鈕中
        self.tray.setContextMenu(self.trayMenu)

    def Exit(self):
        # 點選關閉按鈕或者點選退出事件會出現圖示無法消失的bug,需要手動将圖示記憶體清除
        self.tray = None
        sys.exit(app.exec_())

    def Show(self):
        self.show()



if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = TaryWiondw()
    sys.exit(app.exec_())