pyqt5 窗口最小化到windows托盘

pyqt5创建的程序一般是默认可以最小化到任务栏的,这也是一般程序都会有的功能。平时我们使用的有些程序也会最小化到任务栏旁边的托盘上,就是在时间日期旁边的小图标,这个需要额外在pyqt5中写点代码设置下了。

《pyqt5 窗口最小化到windows托盘》

首先我们创建一个demo程序,这个程序就是创建一个窗口,窗口中有一个按钮和textBrowser,按下按钮后可以在textBrowser中写一个helloworld

如果不知道在vscode下如何开发pyqt5,可以参看下这个

https://blog.csdn.net/marwenx/article/details/107152052

主程序代码如下

#coding = 'utf-8'
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import Ui_untitled
import time

# 函数功能:在textBrowser中添加hello world字段
# 输入参数:ui对象
# 输出参数:
def buttonClicked(girl):
    girl.textBrowser.append("hello world")

if __name__ == '__main__':
    # 创建一个应用对象
    app = QtWidgets.QApplication(sys.argv)
    # 创建QT主窗口对象
    MainWindow = QtWidgets.QMainWindow()
    # 创建UI对象
    ui = Ui_untitled.Ui_MainWindow()
    # 调用setupUi方法,将设计好的界面-->主窗口上
    ui.setupUi(MainWindow)

    ui.pushButton.clicked.connect(lambda:buttonClicked(ui))

    # 显示一个非模式的对话框,用户可以随便切窗口,.exec()是模式对话框,用户不能随便切
    MainWindow.show()
    # 
    sys.exit(app.exec_())

自动生成的Ui_untitled.py如下

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'c:\My_World\gitee_code\qt_toolkit\untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser.setGeometry(QtCore.QRect(160, 110, 256, 192))
        self.textBrowser.setObjectName("textBrowser")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(570, 190, 75, 23))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))

写好demo后运行下

《pyqt5 窗口最小化到windows托盘》

点右上角的这个最小化按钮,可以看到默认是最小化到任务栏的,而不是在托盘上。

《pyqt5 窗口最小化到windows托盘》

《pyqt5 窗口最小化到windows托盘》

修改下代码即可完成最小化到托盘的设置。

为了完成这个最小化到托盘上的目的,可以修改下程序。

首先新建一个类。

class TrayIcon(QtWidgets.QSystemTrayIcon):
    def __init__(self,MainWindow,parent=None):
        super(TrayIcon, self).__init__(parent)
        self.ui = MainWindow
        self.createMenu()
    
    def createMenu(self):
        self.menu = QtWidgets.QMenu()
        self.showAction1 = QtWidgets.QAction("启动", self, triggered=self.show_window)
        self.showAction2 = QtWidgets.QAction("显示通知", self,triggered=self.showMsg)
        self.quitAction = QtWidgets.QAction("退出", self, triggered=self.quit)

        self.menu.addAction(self.showAction1)
        self.menu.addAction(self.showAction2)
        self.menu.addAction(self.quitAction)
        self.setContextMenu(self.menu)

        #设置图标
        self.setIcon(QtGui.QIcon("c:\\My_World\\gitee_code\\qt_toolkit\\hello_world\\sys-user.png"))
        self.icon = self.MessageIcon()

        #把鼠标点击图标的信号和槽连接
        self.activated.connect(self.onIconClicked)

    def showMsg(self):
        self.showMessage("Message", "skr at here", self.icon)

    def show_window(self):
        #若是最小化,则先正常显示窗口,再变为活动窗口(暂时显示在最前面)
        self.ui.showNormal()
        self.ui.activateWindow()
        
 
    def quit(self):
        QtWidgets.qApp.quit()

    #鼠标点击icon传递的信号会带有一个整形的值,1是表示单击右键,2是双击,3是单击左键,4是用鼠标中键点击
    def onIconClicked(self, reason):
        if reason == 2 or reason == 3:
            # self.showMessage("Message", "skr at here", self.icon)
            if self.ui.isMinimized() or not self.ui.isVisible():
                #若是最小化,则先正常显示窗口,再变为活动窗口(暂时显示在最前面)
                self.ui.showNormal()
                self.ui.activateWindow()
                self.ui.setWindowFlags(QtCore.Qt.Window)
                self.ui.show()
            else:
                #若不是最小化,则最小化
                self.ui.showMinimized()
                self.ui.setWindowFlags(QtCore.Qt.SplashScreen)
                self.ui.show()
                # self.ui.show()

这个类的作用是这样的,首先会创建一个托盘的图标,这个图标右键能显示三个选项完成了三个功能,一个是启动主界面,一个是显示通知,一个是结束程序。

使用的时候修改下图标的路径就好,当然如果找不到也不会报错,只不过显示的是默认图标。

在主函数中使用这个类,只需要用

ti = TrayIcon(MainWindow)
ti.show()

就可以了。

所以修改后的代码如下(ui没有修改直接用就可以):

#coding = 'utf-8'
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import Ui_untitled
import time

# 函数功能:在textBrowser中添加hello world字段
# 输入参数:ui对象
# 输出参数:
def buttonClicked(girl):
    girl.textBrowser.append("hello world")

class TrayIcon(QtWidgets.QSystemTrayIcon):
    def __init__(self,MainWindow,parent=None):
        super(TrayIcon, self).__init__(parent)
        self.ui = MainWindow
        self.createMenu()
    
    def createMenu(self):
        self.menu = QtWidgets.QMenu()
        self.showAction1 = QtWidgets.QAction("启动", self, triggered=self.show_window)
        self.showAction2 = QtWidgets.QAction("显示通知", self,triggered=self.showMsg)
        self.quitAction = QtWidgets.QAction("退出", self, triggered=self.quit)

        self.menu.addAction(self.showAction1)
        self.menu.addAction(self.showAction2)
        self.menu.addAction(self.quitAction)
        self.setContextMenu(self.menu)

        #设置图标
        self.setIcon(QtGui.QIcon("c:\\My_World\\gitee_code\\qt_toolkit\\hello_world\\sys-user.png"))
        self.icon = self.MessageIcon()

        #把鼠标点击图标的信号和槽连接
        self.activated.connect(self.onIconClicked)

    def showMsg(self):
        self.showMessage("Message", "skr at here", self.icon)

    def show_window(self):
        #若是最小化,则先正常显示窗口,再变为活动窗口(暂时显示在最前面)
        self.ui.showNormal()
        self.ui.activateWindow()
        
 
    def quit(self):
        QtWidgets.qApp.quit()

    #鼠标点击icon传递的信号会带有一个整形的值,1是表示单击右键,2是双击,3是单击左键,4是用鼠标中键点击
    def onIconClicked(self, reason):
        if reason == 2 or reason == 3:
            # self.showMessage("Message", "skr at here", self.icon)
            if self.ui.isMinimized() or not self.ui.isVisible():
                #若是最小化,则先正常显示窗口,再变为活动窗口(暂时显示在最前面)
                self.ui.showNormal()
                self.ui.activateWindow()
            
                self.ui.show()
            else:
                #若不是最小化,则最小化
                self.ui.showMinimized()
                
                self.ui.show()
                

if __name__ == '__main__':
    # 创建一个应用对象
    app = QtWidgets.QApplication(sys.argv)
    # 创建QT主窗口对象
    MainWindow = QtWidgets.QMainWindow()
    # 创建UI对象
    ui = Ui_untitled.Ui_MainWindow()
    # 调用setupUi方法,将设计好的界面-->主窗口上
    ui.setupUi(MainWindow)

    MainWindow.setWindowFlags(QtCore.Qt.Window)
    
    ui.pushButton.clicked.connect(lambda:buttonClicked(ui))
 
    # 显示一个非模式的对话框,用户可以随便切窗口,.exec()是模式对话框,用户不能随便切
    MainWindow.show()

    ti = TrayIcon(MainWindow)
    ti.show()

    sys.exit(app.exec_())

这样的话就可以在托盘上显示图标了,而且这个图标左键的话会最小化最大化我们的主窗口,右键的话实现了三个功能,一个是显示主窗口,一个是通知,一个是关闭程序。

但是还有个问题,就是任务栏上的图标不能隐藏,也就是说在即使窗口最小化之后,仍然会在任务栏上显示一个图标,而且一般的软件都是会在用户关闭程序时,让用户选择是否最小话到托盘,这种的话我们下次解决。

    原文作者:Marvin_Xavier
    原文地址: https://blog.csdn.net/marwenx/article/details/107200049
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞