68-输入和显示-系统托盘QSystemTrayIcon

系统托盘QSystemTrayIcon

QSystemTrayIcon类为应用程序在系统托盘中提供一个图标。

现代操作系统通常在桌面上提供一个特殊的区域,称为系统托盘或通知区域,长时间运行的应用程序可以显示图标和短消息。

系统托盘.png

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

    此枚举描述在显示气球消息时显示的图标。

    ConstantDescription
    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上,只有在没有设置上下文菜单的情况下才会触发双击,因为鼠标按下时菜单就会打开

ConstantDescription
QSystemTrayIcon.Trigger单击系统托盘条目
QSystemTrayIcon.MiddleClick使用鼠标中间按钮单击系统托盘条目

实例

image-20230402180933412

通过按钮直接显示或者关闭托盘图标,最小化时隐藏窗口和任务栏图标

双击托盘图标或单击通知消息可以显示窗口

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要实现程序关闭后显示系统托盘区,需要使用 Qt 的 QSystemTrayIcon 类。具体实现步骤如下: 1. 在程序初始化时创建 QSystemTrayIcon 对象,并设置其图标、提示信息等属性; 2. 重写程序的 closeEvent() 函数,在程序关闭前将其隐藏,并在系统托盘显示 QSystemTrayIcon 对象; 3. 在 QSystemTrayIcon 对象的 activated() 信号中,处理双击托盘图标显示程序主窗口的事件。 示例代码如下: ```cpp #include <QSystemTrayIcon> #include <QMenu> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 创建系统托盘图标 trayIcon = new QSystemTrayIcon(this); trayIcon->setIcon(QIcon(":/images/icon.png")); trayIcon->setToolTip(tr("My Application")); // 创建托盘菜单 trayMenu = new QMenu(this); QAction *showAction = new QAction(tr("Show"), this); QAction *quitAction = new QAction(tr("Quit"), this); connect(showAction, &QAction::triggered, this, &MainWindow::showNormal); connect(quitAction, &QAction::triggered, qApp, &QApplication::quit); trayMenu->addAction(showAction); trayMenu->addAction(quitAction); trayIcon->setContextMenu(trayMenu); // 监听系统托盘图标的激活事件 connect(trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::trayIconActivated); } protected: void closeEvent(QCloseEvent *event) override { if (trayIcon->isVisible()) { hide(); event->ignore(); } else { event->accept(); } } private slots: void trayIconActivated(QSystemTrayIcon::ActivationReason reason) { if (reason == QSystemTrayIcon::DoubleClick) { showNormal(); } } private: QSystemTrayIcon *trayIcon; QMenu *trayMenu; }; ``` 在程序退出时,需要手动删除 QSystemTrayIcon 对象,代码如下: ```cpp delete trayIcon; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值