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_())
posted @ 2022-06-27 15:15  Yogile  阅读(2101)  评论(0编辑  收藏  举报