PyQt5 托盘以及托盘关闭bug解决

PyQt5创建托盘

使用到的包

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

步骤

  1. 创建PyQt基本套路

  2. 创建QSystemTrayIcon托盘对象

    self.tray = QSystemTrayIcon()
    
  3. 创建QIcon对象,将其设置为Tray(托盘)图标

    self.trayIconPix = QPixmap(16,16)
    self.trayIconPix.fill(QColor(100,100,100))
    self.Icon = QIcon(self.trayIconPix)
    self.tray.setIcon(self.Icon)
    
  4. 创建QMenu(菜单)对象,创建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(菜单)对象设置到右键触发(setContextMenu)事件中

    self.tray.setContextMenu(self.trayMenu)
    

问题

  • 点击关闭叉叉按钮或者托盘右键出来的Quit虽然程序已经结束了,但是托盘图标还是会继续停留在系统托盘中,直到鼠标移到图标上才会消失
    • 解决:需要重写退出事件,在程序结束前需要先将QSystemTrayIcon对象内存清空

代码

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)

        # 创建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_())
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 原文https://github.com/maicss/PyQt5-Chinese-tutorial/blob/m...
    dingtom阅读 5,366评论 0 2
  • 创建第一个GUI界面 首先,我们使用pyqt5的窗口小部件创建一个最基本的GUI: 在上面的程序中,我们首先引用了...
    JackHCC阅读 8,209评论 0 7
  • 下面的代码为:创建一个带有按钮和两个单行编辑框的窗口。 对于单行编辑框,我们处理获得和失去输入焦点的事件。通过按下...
    用电热毯烤猪阅读 12,888评论 0 48
  • 本章学习Qt的基本功能 例1,简单的窗口 这个简单的小例子展示的是一个小窗口。但是我们可以在这个小窗口上面做很多事...
    派派森森阅读 60,184评论 1 17
  • 原文:https://github.com/electron/electron/blob/master/docs/...
    Shmily落墨阅读 6,190评论 1 2

友情链接更多精彩内容