目錄
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/arthttps://blog.csdn.net/marwenx/article/details/107200049
1)重寫系統托盤類,設置托盤圖標等屬性
具有以下功能:
鼠標右鍵點擊托盤圖標,會有三個功能的菜單欄(啟動、顯示通知、退出)
from PyQt5 import QtWidgets,QtCore,QtGui
import ospath = 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 = MainWindowself.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 TrayIconfrom PyQt5.QtWidgets import QMessageBox,QMainWindow,QApplication
from PyQt5 import QtCore
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlotimport sys,psutil,os,datetime,pyttsx3,timepath = 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)來實現這些功能
?這里我是通過工具欄和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#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.WindowMinimizeButtonHintQtCore.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側邊拖.https://blog.csdn.net/marwenx/article/details/107226987
1)退出后托盤圖標還是存在,沒有消失
加上一句,在退出前,先將托盤圖標設置為不可見
# 函數功能:退出程序def quit(self):self.setVisible(False) # 托盤圖標會自動消失QtWidgets.qApp.quit()
2)最小化后左下角會出現?窗口
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"))