应用最小化到托盘
现代操作系统通常在桌面上提供一个特殊区域,称为系统托盘或通知区域。对一个GUI程序,如果在最小化时,程序做任务栏消失或者点击关闭按钮时,应用并不关闭,而是在系统托盘上显示一个图标,来表示该程序仍在运行,在托盘上打开上下文菜单,可以恢复程序正常显示,或者完全退出应用等操作。
要实现一个具有最小化到托盘功能的程序,要使用到类QSystemTrayIcon。该类为操作系统托盘的类,通过QSystemTrayIcon,可以在托盘上显示指定程序的图标,响应用户鼠标操作,显示指定消失,显示菜单等。
QSystenTrayIcon的常用函数有:
- setIcon(self, icon:QIcon):设置程序在系统托盘上显示的图标。
- setToolTip((self, tip: str): 设置鼠标放到图标上的提示文字。
- setContextMenu(self, menu: QMenu): 设置上下文菜单,在托盘图标上点击鼠标右键时,将弹出该菜单。
- show(self): 显示系统托盘图标。
- hide(self): 隐藏系统托盘图标。
- isSystemTrayAvailable(): 静态函数,判断系统是否支持托盘功能。
- showMessage(self, title: str, msg: str, icon: 'QSy;, msecs: int):
showMessage(self, title: str, msg: str, icon: QIcon, msecs: int):
显示状态通知消息(气球信息),参数title为标题信息,msg为要显示的信息,icon为气球信息中显示的图标, msecs为显示持续时间,单位为毫秒。
QSystenTrayIcon的常用消息:
- messageClicked(self):用户单击使用showMessage()显示的消息时,将发出此信号。
- activated(self, reason: 'QSy;) :用户激活系统任务栏图标时,将发出此信号。reason指定激活的原因。
枚举变量QSy:
- QSy (0): 不显示图标。
- QSystemTrayIcon. Information (1): 显示信息图标。
- QSy (2): 显示告警图标。
- QSystemTrayIcon::Critical (3): 显示致命错误图标。
枚举变量 QSy:
- QSy (0): 未知原因。
- QSy (1): 请求系统托盘的上下文菜单。
- QSy (2): 鼠标双击。
- QSy (3): 鼠标单击。
- QSy (4): 点击鼠标中键
测试
测试程序以pyqt5-examples/deskto为基础,演示对气球消息的控制设置,以及最小化到托盘后,如何通过菜单将程序恢复到常规状态和退出程序。完整代码如下:
import sys from PyQ import QIcon from PyQ import (QApplication, QDialog, QMessageBox, QPushButton, QLabel, QCheckBox, QComboBox, QLineEdit, QSpinBox, QMenu, QAction, QGridLayout, QHBoxLayout, QVBoxLayout, QTextEdit,QGroupBox, QStyle, QSystemTrayIcon) import resource_rc class SystemTrayDemo(QDialog): def __init__(self): super(SystemTrayDemo, self).__init__() # 设置窗口标题 ('实战PyQt5: 演示应用最小化到托盘') #设置窗口尺寸 (400, 300) = QIcon(':/panda.png') () () def initUi(self): () () mainLayout = QVBoxLayout() mainLayout.addWidge) (mainLayout) #让托盘图标显示在系统托盘上 () #创建托盘图标 def createTrayIcon(self): aRestore = QAction('恢复(&R)', self, triggered = ) aQuit = QAction('退出(&Q)', self, triggered = QA().quit) menu = QMenu(self) menu.addAction(aRestore) menu.addAction(aQuit) = QSystemTrayIcon(self) .setIcon() .setContextMenu(menu) .messageClicked.connect) .activated.connect) #气球信息控制部分 def createMessageGroupBox(self): = QGroupBox('气球消息') #==== 消息类型控制部分 ====# typeLabel = QLabel('消息类型:') = QComboBox() .addItem('无类型', QSy) .addItem().standardIcon), '信息', QSy) .addItem().standardIcon), '警告', QSy) .addItem().standardIcon), '错误', QSy) .setCurrentIndex(1) #==== 消息显示持续时间部分 ====# durationLabel = QLabel('持续时间:') = QSpinBox() .setRange(5, 60) #时间范围 .setSuffix(' s') #后缀,秒 .setValue(15) # 缺省时间 15秒 #spinbox 右边的警告提示信息 durationWarningLabel = QLabel('(一些系统可能会忽略消息显示的持续时间控制)') dura(10) #==== 消息标题栏控制 ====# titleLabel = QLabel('标题:') = QLineEdit('不能连接到网络') #==== 消息编辑栏 ====# bodyLabel = QLabel('消息:') = QTextEdit() .setPlainText('不要问我, 老实说吧,我也不知道原因。' '\n请点击气球图标获得更多信息') #==== 显示消息按钮 ====# showMessageButton = QPushButton('显示消息') (True) ) #==== 将上述部件加入到一个网格布局中 msgLayout = QGridLayout() m(typeLabel, 0, 0) #0行0列 m(, 0, 1, 1, 2) #0行1列, 占1行2列 m(durationLabel, 1, 0) #1行0列 m(, 1, 1) #1行1列 m(durationWarningLabel, 1, 2, 1, 3) #1行2列, 占1行3列 m(titleLabel, 2, 0) #2行0列 m(, 2, 1, 1, 4) #2行1列, 占1行4列 m(bodyLabel, 3, 0) #3行0列 m(, 3, 1, 2, 4) #3行1列, 占2行4列 m(showMessageButton, 5, 4) #5行4列 m(3, 1) m(4, 1) .setLayout(msgLayout) #显示气球信息 def showMessage(self): #根据消息类型获取图标 icon = QSy(.itemData(.currentIndex())) Message(.text(), #标题 .toPlainText(), #信息 icon, #图标 .value() * 1000) #信息显示持续时间 #关闭事件处理, 不关闭,只是隐藏,真正的关闭操作在托盘图标菜单里 def closeEvent(self, event): if .isVisible(): QMe(self, '系统托盘', '程序将继续在系统托盘中运行,要终止本程序,\n' '请在系统托盘入口的上下文菜单中选择"退出"') () event.ignore() def messageClicked(self): QMe(None, '系统托盘', '对不起,我已经尽力了。' '也许你应该试着问一个人?') def iconActivated(self, reason): if reason in , QSy): () if __name__ == '__main__': app = QApplication) #如果系统不支持最小化到托盘 if not QSy(): QMe(None, '系统托盘', '本系统不支持托盘功能') (1) QA(False) window = SystemTrayDemo() window.show() ())
运行结果如下图:
应用最小化到系统托盘
本文知识点
- 应用最小化到托盘的方法。
- 控制托盘气球信息。
- 通过托盘图标恢复应用的正常显示或者退出应用。
喜欢本文内容就多多关注,评论,收藏,点赞,和转发。