PyQt5創(chuàng)建托盤
使用到的包
- QtWidgets.Qwidget、QtWidgets.QsystemTrayIcon、QtWidgets.QMenu、QtWidgets.QAction、QtWidgets.QApplication
- QtGui.Qicon、QtGui.QColor、QtGui.QPixmap
- sys
步驟
創(chuàng)建PyQt基本套路
-
創(chuàng)建QSystemTrayIcon托盤對象
self.tray = QSystemTrayIcon() -
創(chuàng)建QIcon對象,將其設(shè)置為Tray(托盤)圖標
self.trayIconPix = QPixmap(16,16) self.trayIconPix.fill(QColor(100,100,100)) self.Icon = QIcon(self.trayIconPix) self.tray.setIcon(self.Icon) -
創(chuàng)建QMenu(菜單)對象,創(chuàng)建QAction(行為)對象,將QAction(行為)對象添加至QMenu(菜單)對象中,相當于綁定點擊事件
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) -
將QMenu(菜單)對象設(shè)置到右鍵觸發(fā)(setContextMenu)事件中
self.tray.setContextMenu(self.trayMenu)
問題
- 點擊關(guān)閉叉叉按鈕或者托盤右鍵出來的Quit雖然程序已經(jīng)結(jié)束了,但是托盤圖標還是會繼續(xù)停留在系統(tǒng)托盤中,直到鼠標移到圖標上才會消失
- 解決:需要重寫退出事件,在程序結(jié)束前需要先將QSystemTrayIcon對象內(nèi)存清空
代碼
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__()
# 創(chuàng)建托盤對象
self.tray = QSystemTrayIcon()
# 創(chuàng)建QIcon對象,用于設(shè)置圖標(圖片過大會出錯)
self.trayIconPix = QPixmap(16,16)
self.trayIconPix.fill(QColor(100,100,100))
self.Icon = QIcon(self.trayIconPix)
# 設(shè)置托盤圖標(QIcon圖標過大或者出錯會導(dǎo)致托盤顯示不出來)
self.tray.setIcon(self.Icon)
# 創(chuàng)建QAction
showAction = QAction("&Show", self, triggered = self.Show)
quitAction = QAction("&Quit", self, triggered = self.Exit)
# 創(chuàng)建菜單對象
self.trayMenu = QMenu(self)
# 將動作對象添加到菜單
self.trayMenu.addAction(showAction)
# 增加分割線
self.trayMenu.addSeparator()
self.trayMenu.addAction(quitAction)
# 將菜單欄加入到右鍵按鈕中
self.tray.setContextMenu(self.trayMenu)
def Exit(self):
# 點擊關(guān)閉按鈕或者點擊退出事件會出現(xiàn)圖標無法消失的bug,需要手動將圖標內(nèi)存清除
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_())