系统托盘QSystemTrayIcon
QSystemTrayIcon类为应用程序在系统托盘中提供一个图标。
现代操作系统通常在桌面上提供一个特殊的区域,称为系统托盘或通知区域,长时间运行的应用程序可以显示图标和短消息。
QSystemTrayIcon 类可以在以下平台上使用:
- 所有受支持的 Windows 版本。
- 所有实现 D-Bus StatusNotifierItem 规范的 Linux 桌面环境,包括 KDE、Gnome、Xfce、LXQt 和 DDE。
- 实现 freedesktop.org XEmbed 系统托盘规范的 X11 的所有窗口管理器和独立托盘实现。
- 所有受支持的 macOS 版本。
from PySide6.QtWidgets import QSystemTrayIcon
QSystemTrayIcon(icon: Union[PySide6.QtGui.QIcon,PySide6.QtGui.QPixmap],parent: Union[PySide6.QtCore.QObject,NoneType] = None)-> None
QSystemTrayIcon(parent: Union[PySide6.QtCore.QObject,NoneType] = None)-> None
构造一个 QSystemTrayIcon 对象,其中包含给定的icon和parent
该图标最初是不可见的。
- 要检查用户桌面上是否存在系统托盘,请调用
isSystemTrayAvailable()
静态函数。 - 要添加系统托盘条目,请创建一个 QSystemTrayIcon 对象,调用 setContextMenu()为图标提供上下文菜单
- 调用 show()使其在系统托盘中可见。
- 状态通知消息(“气球消息”)可以随时使用 showMessage()显示。
- 如果在构建系统托盘图标时系统托盘不可用,但稍后变为可用,则QSystemTrayIcon将自动在系统托盘中为应用程序添加条目(如果图标为)。visible
- 当用户激活图标时,会发出 active()信号。
- 仅在 X11 上,当请求工具提示时,QSystemTrayIcon 才会收到 .此外,QSystemTrayIcon 接收类型的轮子事件。这些在任何其他平台上都不受支持。
方法和槽函数
方法 | 描述 |
---|---|
contextMenu() | RETURN TYPE–PySide6.QtWidgets.QMenu 返回系统托盘项的当前上下文菜单。 |
geometry() | RETURN TYPE–PySide6.QtCore.QRect 返回系统托盘图标在屏幕坐标中的几何形状。 |
icon() | RETURN TYPE–PySide6.QtGui.QIcon 此属性保存系统托盘图标。 在Windows上,系统托盘图标大小为16x16;在X11上,首选的大小是22x22。图标将根据需要缩放到适当的大小。 |
isVisible() | RETURN TYPE–bool 此属性表示系统托盘项是否可见。 将此属性设置为true或调用show()使系统托盘图标可见;将此属性设置为false或调用hide()可以隐藏它。 |
setContextMenu(menu:PySide6.QtWidgets.QMenu) | 将指定的设置为系统托盘icon.menu的上下文菜单 当用户通过单击鼠标按钮请求系统托盘图标的上下文菜单时,菜单将弹出。 在macOS上,它目前被转换为NSMenu,因此不会发出aboutToHide()信号。 系统托盘图标不具有菜单的所有权。您必须确保在适当的时间删除它,例如,使用适当的父对象创建菜单。 |
setIcon(icon:PySide6.QtGui.QIcon) | 此属性保存系统托盘图标。 在Windows上,系统托盘图标大小为16x16;在X11上,首选的大小是22x22。图标将根据需要缩放到适当的大小。 |
setToolTip(tip:str) | 此属性保存系统托盘项的工具提示。 在某些系统上,工具提示的长度是有限的。如有必要,工具提示将被截断。 |
toolTip() | RETURN TYPE–str 此属性保存系统托盘项的工具提示。 在某些系统上,工具提示的长度是有限的。如有必要,工具提示将被截断。 |
[Slot]hide() | 隐藏系统托盘条目。 |
[Slot]setVisible(visible: bool) | 此属性表示系统托盘项是否可见。 将此属性设置为true或调用show()使系统托盘图标可见;将此属性设置为false或调用hide()可以隐藏它。 |
[Slot]show() | 显示系统托盘中的图标。 |
[Slot]showMessage(title:str,msg:str,icon:PySide6.QtGui.QIcon[,msecs:int=10000]) | 这个函数重载showMessage()。 发出气泡消息 指定的millisececonds 毫秒时间,显示具有给定title 、和自定义icon 图标的条目的msg气球消息 |
[Slot]showMessage(title:str,msg:str[,icon=QSystemTrayIcon.Information[,msecs:int=10000]]) | 发出气泡消息,功能同上但是图标可选几个枚举值 用户可以点击消息;当这种情况发生时,messageclick()信号将被触发。 注意,消息的显示取决于系统配置和用户首选项,消息可能根本不会出现。因此,不应依赖它作为提供关键信息的唯一手段。 在Windows上,当应用程序有focus. msecondstimeouthint时,通常会被系统忽略 在Qt 5.2中已经变成了一个插槽。 icon枚举见下表 |
[Static]isSystemTrayAvailable() | RETURN TYPE–bool 如果系统托盘可用,则返回true;否则返回false 如果系统托盘当前不可用,但稍后变得可用,QSystemTrayIcon将自动在系统托盘中添加一个条目,如果它是.visible |
[Static]supportsMessages() | RETURN TYPE–bool 如果系统托盘支持气球消息则返回true;否则返回false |
-
PySide6.QtWidgets.QSystemTrayIcon.MessageIcon
此枚举描述在显示气球消息时显示的图标。
Constant Description QSystemTrayIcon.NoIcon 不显示图标。 QSystemTrayIcon.Information 将显示一个信息图标。 QSystemTrayIcon.Warning 将显示标准警告图标。 QSystemTrayIcon.Critical 将显示一个严重警告图标。
信号
信号 | 描述 |
---|---|
[Signal]activated(reason: PySide6.QtWidgets.QSystemTrayIcon.ActivationReason) | 当用户激活系统托盘图标时发出此信号。指定激活的原因。枚举各种原因 reason见上面枚举 |
[Signal]messageClicked() | 当用户单击使用showMessage()显示的消息时,将发出此信号。 我们遵循Microsoft Windows的行为,所以当用户单击托盘图标并显示气球消息时,也会发出信号。 |
PySide6.QtWidgets.QSystemTrayIcon.ActivationReason
此枚举描述激活系统托盘的原因。
ActivationReason | 描述 |
---|---|
QSystemTrayIcon.Unknown | 不明原因 |
QSystemTrayIcon.Context | 请求系统托盘条目的上下文菜单 |
QSystemTrayIcon.DoubleClick | 双击系统托盘条目。 |
在macOS上,只有在没有设置上下文菜单的情况下才会触发双击,因为鼠标按下时菜单就会打开
Constant | Description |
---|---|
QSystemTrayIcon.Trigger | 单击系统托盘条目 |
QSystemTrayIcon.MiddleClick | 使用鼠标中间按钮单击系统托盘条目 |
实例
通过按钮直接显示或者关闭托盘图标,最小化时隐藏窗口和任务栏图标
双击托盘图标或单击通知消息可以显示窗口
# -*- coding: UTF-8 -*-
# File date: Hi_2023/4/2 17:46
# File_name: 01-系统托盘QSystemTrayIcon例子.py
import sys
import PySide6.QtGui
from PySide6 import QtCore
from PySide6.QtCore import Qt
from PySide6.QtGui import QAction,QIcon
from PySide6.QtWidgets import QSystemTrayIcon,QMenu,QWidget,QApplication,QPushButton,QVBoxLayout
class MyTrayIcon(QSystemTrayIcon):
def __init__(self,parent=None):
super().__init__(parent)
self.showMenu()
self.other()
def showMenu(self):
"设计托盘的菜单,这里我实现了一个二级菜单"
self.menu = QMenu()
self.menu1 = QMenu()
self.showAction1 = QAction("显示消息1",self,triggered=self.showM)
self.showAction2 = QAction("显示消息2",self,triggered=self.showM)
self.showwin = QAction("启动",self,triggered=self.show_window)
self.quitAction = QAction("退出",self,triggered=self.quit)
self.menu1.addAction(self.showAction1)
self.menu1.addAction(self.showAction2)
self.menu.addMenu(self.menu1,)
self.menu.addAction(self.showAction1)
self.menu.addAction(self.showAction2)
self.menu.addAction(self.quitAction)
self.menu.addAction(self.showwin)
self.menu1.setTitle("二级菜单")
self.setContextMenu(self.menu)
def other(self):
self.activated.connect(self.iconClied)# 把鼠标点击图标的信号和槽连接
self.messageClicked.connect(self.mClied)# 把鼠标点击弹出消息的信号和槽连接
self.setToolTip("这是pyside6程序系统托盘图标,右键可以触发菜单")
self.setIcon(QIcon("../../../Resources/Icons/python_96px.ico"))# 设置任务栏图标
# self.icon = QSystemTrayIcon.MessageIcon.Information # 设置消息枚举图标
self.icon = QIcon("../../../Resources/Icons/python_96px.ico")# 设置消息自定义图标
self.activated.connect(self.click_icon_show_window)# 双击托盘图标显示主窗口
self.messageClicked.connect(self.show_window)# 点击消息时显示主窗口
def iconClied(self,reason):
"鼠标点击icon传递的信号会带有一个整形的值,1是表示单击右键,2是双击,3是单击左键,4是用鼠标中键点击"
if reason == 2 or reason == 3:
pw = self.parent()
if pw.isVisible():
pw.hide()
else:
pw.show()
print(reason)
def show_window(self):
"""显示窗口"""
self.parent().showNormal()# 最大化或最小化显示后回到正常显示
self.parent().activateWindow()# 设置成活动窗口,活动窗口可以获得键 盘输入
def click_icon_show_window(self,reason):
"""双击图标显示窗口"""
if reason == QSystemTrayIcon.ActivationReason.DoubleClick:
self.show_window()
def mClied(self):
"""点击消息触发"""
self.showMessage("提示","你点了消息",self.icon)
def showM(self):
"""点击菜单动作触发"""
self.showMessage("测试","我是消息",self.icon)
def quit(self):
"""取消绘制窗口后退出"""
self.setVisible(False)# 取消绘制窗口
self.hide()# 隐藏托盘图标
QApplication.quit()# 退出
sys.exit()
class window(QWidget):
def __init__(self,parent=None):
super().__init__(parent)
print(QSystemTrayIcon.isSystemTrayAvailable())
self.systemtrayicon = MyTrayIcon(self)
self.setupUi()
def setupUi(self):
self.resize(200,150)
v = QVBoxLayout(self)
show_btn = QPushButton("显示托盘图标")
hide_btn = QPushButton("隐藏托盘图标")
v.addWidget(show_btn)
v.addWidget(hide_btn)
show_btn.clicked.connect(self.systemtrayicon.show)
hide_btn.clicked.connect(self.systemtrayicon.hide)
def changeEvent(self,event: PySide6.QtCore.QEvent)-> None:
"""当最小化时隐藏窗口"""
if event.type()== QtCore.QEvent.WindowStateChange:
if self.windowState()& QtCore.Qt.WindowMinimized:
event.ignore()
self.systemtrayicon.show()
self.hide()# 最小化隐藏窗口
super().changeEvent(event)
if __name__ =="__main__":
import sys
app = QApplication(sys.argv)
w = window()
w.show()
sys.exit(app.exec())