PySide6/PyQT 之应用程序最小化到系统托盘

news2024/9/23 23:24:27

在这里插入图片描述

前言

在使用 PySide6/PyQT 时,应用程序默认只会在任务栏展示一个初始图标。很显然,这是不够人性化的。

而在使用微信时候,

  • 按下键盘的Esc,就是隐藏窗口;
  • 按下键盘的快捷键 Ctrl + Alt + W就是显示隐藏窗口;
  • 窗口隐藏时候可以去系统托盘找到它。

这个设计特性非常有意思。这样的设计可以让应用程序更加人性化、优雅,给用户带来更好的使用体验。

本文将介绍如何使用 PySide6/PyQT 将应用程序最小化到系统托盘,以及如何恢复应用程序。通过学习这篇文章,读者朋友们将了解如何实现这个功能,并为你的应用程序增添一项实用的设计特性。

什么是系统托盘

首先,需要了解什么是系统托盘。系统托盘是操作系统(如 Windows 和 macOS)中的一个特殊区域,用于存放最小化的应用程序图标。当你将应用程序最小化到系统托盘时,应用程序将不再显示在屏幕上,而是被移到系统托盘中。

案例展示

下面展示的动图中的项目是笔者使用 PySide6/PyQT 写的一个小工具,感兴趣的读者朋友们可以通过以下链接获取。

一个Python写的游戏辅助小工具。适用于 咸鱼之王后台挂机、鼠标连击等。

动图展示

在这里插入图片描述

可以看到(注意看键盘按键显示器),

  • 当按下Esc 键时候,窗口隐藏到系统托盘;
  • 按下Ctrl + Alt + W 时候,窗口恢复;

完全达到本文标题所说的功能。!!!

实现

这里用到的知识点,主要就是 键盘监听

  • 键盘监听,因为需要根据按键去触发对应的事件;
  • 为系统托盘的应用添加 菜单选项

关于键盘监听,这里不再赘述。有需要的读者朋友们请查阅这篇文章:Python键盘监听:实现快捷操作和自动化脚本(监听组合键

代码

实现将窗口最小化到系统托盘的功能。使用 PySide6/PyQT 库创建了一个简单的窗口,并在窗口中添加了一个按钮。当点击按钮时,窗口将被隐藏并最小化到系统托盘。同时,系统托盘图标上会显示一个菜单,包含"显示"和"退出"两个选项。

# encoding: utf-8

from PySide6.QtGui import QAction, QIcon, QKeySequence, QShortcut
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QMenu, QSystemTrayIcon


class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("最小化系统托盘")
        self.resize(400, 300)

        # 创建按钮并连接到最小化到系统托盘的方法
        self.button = QPushButton("Minimize to Tray")
        self.button.clicked.connect(self.minimize_to_tray)
        self.setCentralWidget(self.button)

        # 初始化系统托盘相关的对象和菜单项
        self._restore_action = QAction()
        self._quit_action = QAction()
        self._tray_icon_menu = QMenu()
        self.tray_icon = QSystemTrayIcon(self)
        self.tray_icon.setIcon(QIcon("trash.png"))  # 替换为你的图标路径
        self.tray_icon.setToolTip("My Application")

        self.create_actions()
        self.create_tray_icon()
        self.tray_icon.show()

        # 连接系统托盘图标的激活事件
        self.tray_icon.activated.connect(self.tray_icon_activated)

        # 应用程序键盘监听
        self.listen_keyboard()

    def minimize_to_tray(self):
        # 最小化窗口到系统托盘
        self.hide()

    def restore_from_tray(self):
        # 还原窗口
        if self.isMinimized():
            self.showNormal()
        elif self.isMaximized():
            self.showMaximized()
        else:
            self.show()

    def tray_icon_activated(self, reason):
        # 当系统托盘图标被点击时的处理
        if reason == QSystemTrayIcon.ActivationReason.Trigger:
            # 如果点击的是触发事件(比如左键单击),则还原窗口
            self.restore_from_tray()

    def create_actions(self):
        # 创建菜单项
        self._restore_action = QAction("显示", self)
        self._restore_action.triggered.connect(self.restore_from_tray)  # "显示"菜单项触发还原窗口的操作
        self._quit_action = QAction("退出", self)
        self._quit_action.triggered.connect(QApplication.quit)  # "退出"菜单项触发退出应用程序的操作

    def create_tray_icon(self):
        # 创建系统托盘图标和上下文菜单
        self._tray_icon_menu = QMenu(self)
        self._tray_icon_menu.addAction(self._restore_action)
        self._tray_icon_menu.addSeparator()
        self._tray_icon_menu.addAction(self._quit_action)
        self.tray_icon.setContextMenu(self._tray_icon_menu)
        self.tray_icon.show()

    def listen_keyboard(self):
        # 键盘监听
        shortcut = QShortcut(QKeySequence("Esc"), self)
        # 当按下 Esc 键时隐藏窗口
        shortcut.activated.connect(self.hide)


if __name__ == "__main__":
    app = QApplication()
    app.setQuitOnLastWindowClosed(False)

    window = MyWindow()
    window.show()

    app.exec()

代码释义:

  1. 创建一个继承自 QMainWindow 的自定义窗口类 MyWindow。
  2. 在 MyWindow 类的构造函数中进行初始化操作,包括设置窗口标题、大小和布局。
  3. 创建一个 QPushButton 对象,用于实现最小化到系统托盘的功能,并将其与相应的槽函数 minimize_to_tray 连接。
  4. 创建 QActions 对象,用于定义菜单项的动作。这里包括一个用于还原窗口的动作 _restore_action 和一个用于退出应用程序的动作 _quit_action
  5. 创建 QMenu 对象 _tray_icon_menu,用于组织菜单项。
  6. 创建 QSystemTrayIcon 对象 tray_icon,用于管理系统托盘图标。设置图标和提示信息。
  7. 在 MyWindow 类中定义了一些辅助函数,如 minimize_to_tray 用于最小化窗口到系统托盘,restore_from_tray 用于还原窗口,tray_icon_activated 用于处理系统托盘图标的激活事件。
  8. 在 create_actions 函数中,将创建的动作对象添加到菜单中。
  9. 在 create_tray_icon 函数中,将菜单设置为系统托盘图标的上下文菜单,并显示系统托盘图标。
  10. 在应用程序的入口点中,创建 QApplication 对象,并设置 setQuitOnLastWindowClosed(False) 以确保在关闭最后一个窗口时不退出应用程序。

总体而言,这段代码实现了将窗口最小化到系统托盘,并提供了相应的菜单项和图标,方便用户操作和控制窗口的显示和退出。

总结🎈🎈

在这篇文章中,介绍了将 PySide6/PyQT 窗口最小化到系统托盘的功能。

使用QSystemTrayIcon类创建了一个系统托盘图标,并设置了一个上下文菜单,其中包含"显示"和"退出"菜单项。通过连接相应的槽函数,

实现了还原窗口和退出应用程序的操作。当点击按钮时,窗口会最小化到系统托盘,并显示一个系统通知。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/696994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Axure高保真原型】多选树穿梭框选择器

今天和大家分享多选树穿梭框的原型模板,左侧多选树选择子级选项后,可以在右侧看到对应的标签,取消选中也会删除对应标签。多选树可以通过选中或取消选中父级自动选中或取消选对应的子级,也可以选中或取消选子级自动反选父级。右侧…

首届“天网杯”网络安全大赛启动 | 赛宁网安提供全面技术支撑

​​6月25日,由中华人民共和国公安部、天津市人民政府指导,天津市公安局、天津市委网信办、天津市工信局、天津市滨海新区人民政府、公安部第一研究所、国家计算机病毒应急处理中心共同主办,南京赛宁信息技术有限公司提供全面技术支撑的首届“…

文件后缀名和MimeType的映射关系

tomcat 的源码里边有。 打开 Tomcat官网 在 Download 菜单下找一个版本&#xff0c;比如 Tomcat 9&#xff0c;点进去&#xff0c;下载源码 找到 conf 目录下的 web.xml 文件 打开&#xff0c;里边有很多 <mime-mapping> 节点就是&#xff0c;总共一千多个吧 粘出来&…

银行卡如何大批量合并转到一个excel表中?并形成结构化数据

将银行卡图片转为Excel后&#xff0c;可以更方便地进行储存、管理和查看&#xff0c;其次也可以快速地进行数据的筛选、统计处理和分析&#xff0c;以提高工作效率&#xff0c;最后&#xff0c;还可以避免手工输入数据时出现的错误&#xff0c;提高数据的准确性。总之&#xff…

FreeRTOS学习笔记—FreeRTOS移植

文章目录 一、FreeRTOS移植1.1 将FreeRTOS的源码添加到工程1.2 修改部分文件1.2.1 修改 SYSTEM 文件1.2.2 修改 usart.c 文件1.2.3 修改 delay.c 文件 二、FreeRTOS移植测试 一、FreeRTOS移植 这里以博主STM32俗称笔记系列的GPIO工程文件为例&#xff0c;学习一下如何进行Free…

c++语言 打字游戏(随机字母)

c语言 打字游戏(随机字母) 程序运行如下 按 enter 回车键 随机字母之后&#xff0c;输入 测出正确率 用时多少秒 测试完按空格键从新开始 退出系统 按 Esc键 #include <stdio.h> #include <time.h> #include <stdlib.h> #include <math.h> #includ…

Bootstrap 排版

文章目录 Bootstrap 排版标题内联子标题 引导主体副本强调缩写地址&#xff08;Address&#xff09; Bootstrap 排版 Bootstrap 使用 Helvetica Neue、 Helvetica、 Arial 和 sans-serif 作为其默认的字体栈。 使用 Bootstrap 的排版特性&#xff0c;您可以创建标题、段落、列…

解决Tomcat控制台窗口输出乱码问题

由于编码的问题&#xff0c;tomcat的控制台窗口输出的都是中文乱码&#xff0c;这明显是编码格式导致的&#xff0c;只要找到对应的编码格式修改一下就好了&#xff0c; 由于我的服务器编码是GBK&#xff0c;所有只需把输出的编码修改为GBK就行了。 936就是GBK编码。找到tomca…

EasyCVR电子地图鼠标悬停展示经纬度的技术实现

EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可…

python字典学习

读取和拷贝 if __name__ __main__:print()dictInfo {1: "This is one", 2: "", 3: , 5: "This is five"}# 字典的读取assert (len(dictInfo[1]) > 0)assert (len(dictInfo[2]) < 0)assert (len(dictInfo[3]) < 0)if 4 in dictInfo:a…

昨天去银行转钱,最后怒失300万

**本文首发于公众号【看点代码再上班】&#xff0c;建议关注公众号&#xff0c;及时阅读最新文章。** 原文&#xff1a;昨天去银行转钱&#xff0c;最后怒失300万 大家好&#xff0c;我是Eric&#xff0c;这是我的第24篇原创文章 我的300万"不见"了 小埃年初的时候看…

将grub安装到u盘

安装grub sudo apt-get install grub查看磁盘信息 fdisk -lu盘设备是/dev/sdb 使用fdisk编辑磁盘 fdisk /dev/sdbd命令删除磁盘分区 n命令新建磁盘分区 a命令将分区激活 w命令将更改保存到磁盘 创建两个分区&#xff0c;将其中一个设置活动分区。用于安装grub。剩下的分区可…

【源码解读】扩散模型核心:DDPM专题-结合源码讲解

目录 1. 训练1.1 Uniform({1,...,T})1.2 ϵ ∼ N ( 0 , I ) \boldsymbol{\epsilon} \sim \mathcal{N}(\mathbf{0}, \mathbf{I}) ϵ∼N(0,I)1.3 加噪1.4 加噪图片送入UNet预测加入的噪声1.5 预测的噪声和加入的噪声进行损失计算 2. 采样3. 推理 本次训练采用的是cifar数据集&am…

15天涨粉50万!B站有900万人看过都说“震撼”

“卷”是内容创作者对现在互联网竞争最大的评价&#xff0c;创作者之间复制力极强&#xff0c;导致赛道竞争力大&#xff0c;创作者亟待不断地推动自己找到一个又一个新的内容差异、流量风口。 所以不管是创作者还是品牌&#xff0c;只要是涉及到内容运营的都只有一个目标&…

【C#】反射机制,动态加载类文件

系列文章 【C#】编号生成器&#xff08;定义单号规则、固定字符、流水号、业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…

网络解析----yolov3网络解析

Yolov3是一种针对目标检测任务的神经网络模型&#xff0c;其网络结构主要由三个部分组成&#xff1a;特征提取网络、检测头和非极大值抑制&#xff08;NMS&#xff09;模块。特征提取网络采用Darknet-53作为骨干网络&#xff0c;Darknet-53由53个卷积层和5个Max-Pooling层组成&…

死锁的产生

死锁的产生&#xff1a;有一个公共区的玩具&#xff0c;A和B想玩&#xff0c;但是A先得到了玩具&#xff0c;A玩完玩具之后又去干别的事情&#xff0c;但是并没有把玩具还回去&#xff0c;此时B就玩不到了玩具&#xff0c;在无限期的等待。 如下图所示&#xff1a; 线程1把num资…

php压缩一个文件夹,php下载多个图片

$area_id 100;$area_name 一百;shell_exec("cd /www/wwwroot/api/public/images/ && zip -r " . $area_name . ".zip " . $area_id . "/"); 把 100/ 这个文件夹&#xff0c;压缩成 一百.zip 然后得到zip所在的下载url 这个功能&…

百度编辑器(Ueditor)视频上传到阿里云 + 预览不支持FLASH问题解决 + 输入框不展示视频播放页面问题解决

目前需求方提出的问题是以下四个&#xff1a; 1.百度编辑器&#xff08;Ueditor&#xff09;视频上传到阿里云 2.解决不支持FLASH问题 3.视频上传后可以预览 4.修改视频封面 看一下原始的功能是什么样的 上传视频&#xff1a; 视频上传完成 上传视频保存的路径&#xff1…

使用vant组件库

参考网址 Vant Weapp - 轻量、可靠的小程序 UI 组件库 1.在小程序中右键打开外部终端窗口 2.npm init -y 生成package.json 如果没有npm指令则需安装node.js 地址&#xff1a;https://nodejs.org/dist/v18.16.1/node-v18.16.1-x64.msi 3.npm i vant/weapp1.3.3 -S --pro…