【pyqt5学习】——窗口最小化至托盘、取消任务栏图标

目录

1、最小化至托盘

1)重写系统托盘类,设置托盘图标等属性

2)将具体的窗口放入托盘

2、取消任务栏界面图标

3、问题汇总

1)退出后托盘图标还是存在,没有消失

2)最小化后左下角会出现 窗口

3)创建快捷方式后运行软件无图标

1、最小化至托盘

pyqt5 窗口最小化到windows托盘_Marvin_Xavier的博客-CSDN博客_pyqt5 最小化到托盘pyqt5创建的程序一般是默认可以最小化到任务栏的,这也是一般程序都会有的功能。平时我们使用的有些程序也会最小化到任务栏旁边的托盘上,就是在时间日期旁边的小图标,这个需要额外在pyqt5中写点代码设置下了。首先我们创建一个demo程序,这个程序就是创建一个窗口,窗口中有一个按钮和textBrowser,按下按钮后可以在textBrowser中写一个helloworld如果不知道在vscode下如何开发puqt5,可以参看下这个https://blog.csdn.net/marwenx/art《【pyqt5学习】——窗口最小化至托盘、取消任务栏图标》https://blog.csdn.net/marwenx/article/details/107200049

1)重写系统托盘类,设置托盘图标等属性

具有以下功能:

鼠标右键点击托盘图标,会有三个功能的菜单栏(启动、显示通知、退出)

from PyQt5 import QtWidgets,QtCore,QtGui
import os

path = os.path.abspath(__file__)
filePath = os.path.dirname(path)

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(filePath+"/resources/icon.jpg"))
		self.icon = self.MessageIcon()

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

	def showMsg(self):
		self.showMessage("喝水提醒小工具", "点击退出", 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("喝水提醒小工具", "点击退出", 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()

2)将具体的窗口放入托盘

   tray = TrayIcon(main_)
   tray.show()

完整代码 

from main import Ui_MainWindow as Main_Ui # 导入利用Qt设计的界面代码
from Tray import TrayIcon

from PyQt5.QtWidgets import QMessageBox,QMainWindow,QApplication
from PyQt5 import QtCore
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot

import sys,psutil,os,datetime,pyttsx3,time

path = os.path.abspath(__file__)
filePath = os.path.dirname(path)


# 逻辑代码
class main_logic(QMainWindow,Main_Ui):
   def __init__(self):
      super(main_logic, self).__init__()
      self.setupUi(self)
 

if __name__ == '__main__':
   app = QApplication(sys.argv)
   main_ = main_logic()
   main_.showMinimized()
   tray = TrayIcon(main_)
   tray.show()
   sys.exit(app.exec_())

2、取消任务栏界面图标

最小化的时候如果只是按照上面进行的话,最小化到托盘后,任务栏也会有图标,这时候通过设置窗口属性可以取消任务栏图标

不足是会导致最小化等按钮没有,需要通过自定义按钮或者动作(action)来实现这些功能

《【pyqt5学习】——窗口最小化至托盘、取消任务栏图标》 这里我是通过工具栏和action重写了最小化关闭按钮

pyqt5 隐藏任务栏图标_Marvin_Xavier的博客-CSDN博客_pyqt隐藏任务栏pyqt5中隐藏任务栏图标很简单,只需要一行代码即可。MainWindow.setWindowFlags(QtCore.Qt.SplashScreen | QtCore.Qt.FramelessWindowHint)首先还是先了解下pyqt的窗口风格的设置setWindowFlags(Qt.WindowFlags)函数,Qt.WindowFlags类如下:1.窗口类型QtCore.Qt.Widget#插件默认窗口,有最小化、最大化、关闭按钮QtCore.Qt.Window#《【pyqt5学习】——窗口最小化至托盘、取消任务栏图标》https://blog.csdn.net/marwenx/article/details/107226153

MainWindow.setWindowFlags(QtCore.Qt.SplashScreen | QtCore.Qt.FramelessWindowHint)
setWindowFlags(Qt.WindowFlags)函数,Qt.WindowFlags类如下:
 
 
1.窗口类型
 
QtCore.Qt.Widget
#插件默认窗口,有最小化、最大化、关闭按钮
 
QtCore.Qt.Window
#普通窗口,有最小化、最大化、关闭按钮
 
QtCore.Qt.Dialog
#对话框窗口,有问号和关闭按钮
 
QtCore.Qt.Popup
#弹出窗口,窗口无边框化
 
QtCore.Qt.ToolTip
#提示窗口,窗口无边框化,无任务栏窗口
 
QtCore.Qt.SplashScreen
#飞溅屏幕,窗口无边框化,无任务栏窗口
 
QtCore.Qt.SubWindow
#子窗口,窗口无按钮但有标题栏
 
2.使用自定义外观的顶层窗口标志
 
QtCore.Qt.MSWindowsFixedSizeDialogHint
#窗口无法调整大小
 
QtCore.Qt.FramelessWindowHint
#窗口无边框化
 
QtCore.Qt.CustomizeWindowHint
#有边框但无标题栏和按钮,不能移动和拖动
 
QtCore.Qt.WindowTitleHint
#添加标题栏和一个关闭按钮
 
QtCore.Qt.WindowSystemMenuHint
#添加系统目录和一个关闭按钮
 
QtCore.Qt.WindowMaximizeButtonHint
#激活最大化和关闭按钮,禁止最小化按钮
 
QtCore.Qt.WindowMinimizeButtonHint
#激活最小化和关闭按钮,禁止最大化按钮
 
QtCore.Qt.WindowMinMaxButtonsHint
#激活最小化、最大化和关闭按钮,
#相当于QtCore.Qt.WindowMaximizeButtonHint|QtCore.Qt.WindowMinimizeButtonHint
 
QtCore.Qt.WindowCloseButtonHint
#添加一个关闭按钮
 
QtCore.Qt.WindowContextHelpButtonHint
#添加问号和关闭按钮,像对话框一样
 
QtCore.Qt.WindowStaysOnTopHint
#窗口始终处于顶层位置
 
QtCore.Qt.WindowStaysOnBottomHint
#窗口始终处于底层位置

 

3、问题汇总

pyqt5 关闭程序显示提示信息+最小化程序到托盘+隐藏任务栏图标_Marvin_Xavier的博客-CSDN博客_pyqt5 最小化到托盘这个程序主要完成几个目的:1. 主窗口控件最小化等操作后正常可用(点击按钮会在textBrowser中加入一行hello world);2. 点击右上角x键可以显示提示信息且按钮功能正常(退出程序或者最小化到托盘);3. 最小化到托盘后实现两个功能(左键单击显示或隐藏主界面,右键显示显示选线可以关闭或者显示主界面,);1. 首先用designer新建了一个demo,这个demo上只有两个控件,一个是textBrowser,一个是pushButton,直接从designer侧边拖.《【pyqt5学习】——窗口最小化至托盘、取消任务栏图标》https://blog.csdn.net/marwenx/article/details/107226987

1)退出后托盘图标还是存在,没有消失

加上一句,在退出前,先将托盘图标设置为不可见

# 函数功能:退出程序
    def quit(self):
        self.setVisible(False)  # 托盘图标会自动消失
        QtWidgets.qApp.quit()

2)最小化后左下角会出现 窗口

《【pyqt5学习】——窗口最小化至托盘、取消任务栏图标》

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()

 修改为:

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.close()
               

通过托盘图标双击启动后再点击关闭后左下角就消失了 

3)创建快捷方式后运行软件无图标

有时候图标我们用的是相对路径,在创建快捷方式的时候会出错,我们利用绝对路径

path = os.path.abspath(__file__)
filePath = os.path.dirname(path)
self.setIcon(QtGui.QIcon(filePath+"/resources/icon.jpg"))

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