PyQt5 设置系统托盘、双击活动窗口显示、调用 Windows 系统消息通知
设置系统托盘
具体见源码方法
def setTrayIcon(self):...
setContextMenu()
配置右键菜单, show()
使其显示。
双击活动窗口显示
activated[QtWidgets.QSystemTrayIcon.ActivationReason].connect()
将左键双击连接指函数 openMainWindow()
。
QtWidgets.QSystemTrayIcon.ActivationReason
获取点击次数, openMainWindow()
须有参数 reason
判断是否为双击 QtWidgets.QSystemTrayIcon.DoubleClick
。
showNormal()
打开主界面, activateWindow()
使主界面变为活动窗口。
调用 Windows 系统消息方法
根据 QSystemTrayIcon 类 | Qt 小部件 中说明:
现代操作系统通常在桌面上提供一个特殊的区域,称为系统托盘或通知区,长期运行的应用程序可以在这里显示图标和短消息。
QSystemTrayIcon类可以在以下平台上使用:
所有支持的Windows版本。
X11 的所有窗口管理器和独立托盘实现,它们实现了http://standards.freedesktop.org/systemtray-spec/systemtray-spec-0.2.html freedesktop.org XEmbed 系统托盘规范。
所有实现 D-Bus http://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/StatusNotifierItem 规范的X11桌面环境,包括最新版本的 KDE 和 Unity 。
所有支持的 macOS 版本。
要检查一个系统托盘是否在用户的桌面上,调用 QSystemTrayIcon::isSystemTrayAvailable() 静态函数。
要添加一个系统托盘条目,创建一个 QSystemTrayIcon 对象,调用 setContextMenu() 为图标提供一个上下文菜单,并调用 show() 使其在系统托盘中可见。状态通知消息(“气球消息”)可以在任何时候使用 showMessage() 显示。
根据 QSystemTrayIcon 类 | Qt 组件 supportsMessages 中说明:
bool QSystemTrayIcon::supportsMessages()
如果系统托盘支持气球消息,则返回true;否则返回false。
在调用 showMessage()
方法前,应先调用 supportsMessages()
判断系统是否支持和调用 isSystemTrayAvailable()
判断是否创建过 setContextMenu()
提供上下文。
源码
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# 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.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def __init__(self):
self.ui = None
self.trayIconMenu = None
self.quitAppAction = None
self.openMainWindowAction = None
self.trayIcon = None
self.menubar = None
self.centralwidget = None
self.pushButton = None
self.statusbar = None
def setupUi(self, MainWindow):
self.ui = MainWindow
# 主窗口ID
self.ui.setObjectName("MainWindow")
self.ui.resize(800, 600)
# 声明内容组件
self.centralwidget = QtWidgets.QWidget(self.ui)
self.centralwidget.setObjectName("centralwidget")
# 构建内容组件
self.ui.setCentralWidget(self.centralwidget)
# 配置主窗口
self.retranslateUi()
QtCore.QMetaObject.connectSlotsByName(self.ui)
# 配置最小化
self.setTrayIcon()
def retranslateUi(self):
"""
设置主界面
:param MainWindow:
:return:
"""
_translate = QtCore.QCoreApplication.translate
self.ui.setWindowTitle(_translate("MainWindow", "USB Listen"))
self.ui.setWindowIcon(QtGui.QIcon("../amber_logo.ico"))
def setTrayIcon(self):
"""
最小化右键菜单
:return:
"""
# 初始化菜单单项
self.openMainWindowAction = QtWidgets.QAction("消息")
self.quitAppAction = QtWidgets.QAction("退出")
# 菜单单项连接方法
self.openMainWindowAction.triggered.connect(self.windowsMessage)
self.quitAppAction.triggered.connect(self.quitApp)
# 初始化菜单列表
self.trayIconMenu = QtWidgets.QMenu()
self.trayIconMenu.addAction(self.openMainWindowAction)
self.trayIconMenu.addSeparator()
self.trayIconMenu.addAction(self.quitAppAction)
# 构建菜单UI
self.trayIcon = QtWidgets.QSystemTrayIcon()
self.trayIcon.setContextMenu(self.trayIconMenu)
self.trayIcon.setIcon(QtGui.QIcon("../amber_logo.ico"))
self.trayIcon.setToolTip("左键聚焦说明")
# 左键双击打开主界面
self.trayIcon.activated[QtWidgets.QSystemTrayIcon.ActivationReason].connect(self.openMainWindow)
# 允许托盘菜单显示
self.trayIcon.show()
def openMainWindow(self, reason):
"""
双击打开主界面并使其活动
:param reason:
:return:
"""
if reason == QtWidgets.QSystemTrayIcon.DoubleClick:
self.ui.showNormal()
self.ui.activateWindow()
def windowsMessage(self):
"""
配置显示 windows 系统消息通知
:return:
"""
print("example")
if self.trayIcon.supportsMessages() == True and self.trayIcon.isSystemTrayAvailable() == True:
self.trayIcon.showMessage("title", "message", QtGui.QIcon("../amber_logo.ico"), 10000)
else:
print("ERROR: windowsMessage()")
def quitApp(self):
"""
包含二次确认的退出
:return:
"""
checkFlag = QtWidgets.QMessageBox.information(self.ui, "退出确认", "是否确认退出?",
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
if checkFlag == QtWidgets.QMessageBox.Yes:
QtWidgets.qApp.quit()
else:
pass
if __name__ == "__main__":
# 创建活跃 app 句柄
app = QtWidgets.QApplication(sys.argv)
# 关闭全部窗口后程序不退出
app.setQuitOnLastWindowClosed(False)
# 声明界面句柄
mainWindow = QtWidgets.QMainWindow()
# 构建程序界面
ui = Ui_MainWindow()
ui.setupUi(mainWindow)
# 程序启动时打开主界面
# mainWindow.show()
sys.exit(app.exec_())