PyQt5 托盤以及托盤關(guān)閉bug解決

PyQt5創(chuàng)建托盤

使用到的包

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

步驟

  1. 創(chuàng)建PyQt基本套路

  2. 創(chuàng)建QSystemTrayIcon托盤對象

    self.tray = QSystemTrayIcon()
    
  3. 創(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)
    
  4. 創(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)
    
  5. 將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_())
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文https://github.com/maicss/PyQt5-Chinese-tutorial/blob/m...
    dingtom閱讀 1,546評論 0 2
  • 創(chuàng)建第一個GUI界面 首先,我們使用pyqt5的窗口小部件創(chuàng)建一個最基本的GUI: 在上面的程序中,我們首先引用了...
    JackHCC閱讀 3,150評論 0 7
  • 下面的代碼為:創(chuàng)建一個帶有按鈕和兩個單行編輯框的窗口。 對于單行編輯框,我們處理獲得和失去輸入焦點的事件。通過按下...
    用電熱毯烤豬閱讀 9,054評論 0 48
  • 本章學(xué)習(xí)Qt的基本功能 例1,簡單的窗口 這個簡單的小例子展示的是一個小窗口。但是我們可以在這個小窗口上面做很多事...
    派派森森閱讀 60,240評論 1 17
  • 原文:https://github.com/electron/electron/blob/master/docs/...
    Shmily落墨閱讀 2,139評論 1 2

友情鏈接更多精彩內(nèi)容