当前位置: 首页 > news >正文

PyQt 如何通过连续点击托盘图标显示隐藏主窗口并且在主窗口隐藏时调整界面到托盘图标附近

不废话直接看代码

# -*- coding=utf-8 -*-
# ==========================================
#       author: Ruben
#         mail: 773849069@qq.com
#         time: 2023/12/8
# ==========================================
u"""
一个托盘图标的小部件
"""
from Qt import QtWidgets, QtGui, QtCore# --*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*class SystemTrayIcon(QtWidgets.QSystemTrayIcon):"""拓展托盘图标,可移动界面至托盘图标附近"""clicked = QtCore.Signal()  # 单击double_clicked = QtCore.Signal()  # 双击right_clicked = QtCore.Signal()  # 右键def __init__(self, *args, **kwargs):super(SystemTrayIcon, self).__init__(*args, **kwargs)self.activated.connect(self.__activated)def __activated(self, reason):if reason == self.Trigger:self.clicked.emit()elif reason == self.DoubleClick:self.double_clicked.emit()elif reason == self.Context:self.right_clicked.emit()@staticmethoddef available_geometry(pos):"""传入控件位置返回控件所在的屏幕的可用大小Args:pos: QtCore.QPointReturns:QtCore.QRect"""desktop = QtWidgets.QApplication.instance().desktop()return desktop.availableGeometry(pos)def move_widget_to_system_tray_icon(self, widget, margin=10):"""将界面移动到托盘图标附近Args:widget: QWidgetmargin: 10pxReturns:QtCore.QPoint"""center = self.geometry().center()tray_x = center.x()tray_y = center.y()screen_geometry = self.available_geometry(center)# 托盘图标和屏幕边缘的距离top = abs(tray_y - screen_geometry.top())bottom = abs(screen_geometry.bottom() - tray_y)left = abs(tray_x - screen_geometry.left())right = abs(screen_geometry.right() - tray_x)# 获得屏幕边缘的最小距离v = min(top, bottom)  # 纵向h = min(left, right)  # 横向if h < v:  # 纵向菜单栏if right > left:  # 左x = screen_geometry.left() + marginy = tray_y - widget.height()else:  # 右x = screen_geometry.right() - widget.width() - marginy = tray_y - widget.height()else:  # 横向菜单栏if top < bottom:  # 上x = screen_geometry.right() - widget.width() - righty = screen_geometry.top() + marginelse:  # 下x = screen_geometry.right() - widget.width() - righty = screen_geometry.bottom() - widget.height() - 30 - marginwidget.move(x, y)class Application(QtWidgets.QMainWindow):def __init__(self, *args, **kwargs):"""初始化主应用程序窗口"""super(Application, self).__init__(*args, **kwargs)self._initialise_tray()self.setWindowIcon(self.tray_icon())self.setWindowTitle("托盘图标演示主界面")def tray_icon(self):"""使用Qt内置的图标"""icon = self.style().standardIcon(QtWidgets.QStyle.SP_TrashIcon)return icondef _initialise_tray(self):u"""初始化并添加应用程序图标到系统托盘"""self.tray_menu = self._create_tray_menu()self.tray = SystemTrayIcon(self.tray_icon(), self)self.tray.setContextMenu(self.tray_menu)self.tray.clicked.connect(self.show_main_widget)self.tray.show()def _create_tray_menu(self):"""创建菜单并连接信号"""menu = QtWidgets.QMenu()action = menu.addAction("显示主界面")action.triggered.connect(self.show_main_widget)action = menu.addAction("退出")action.triggered.connect(QtWidgets.QApplication.quit)return menudef focus(self):u"""显示窗口并放到最上边"""self.activateWindow()self.showNormal()self.raise_()def show_main_widget(self):"""显示主界面"""if self.isMinimized():# 在最小化状态时,显示界面self.focus()elif self.isHidden():# 隐藏的状态给它显示并移动到托盘图标附近self.tray.move_widget_to_system_tray_icon(self)self.focus()else:# 已显示的给它最小化self.showMinimized()if __name__ == '__main__':_app = QtWidgets.QApplication([])_app.setQuitOnLastWindowClosed(False)_win = Application()_win.resize(300, 100)_win.show()_app.exec_()

相关文章:

PyQt 如何通过连续点击托盘图标显示隐藏主窗口并且在主窗口隐藏时调整界面到托盘图标附近

不废话直接看代码 # -*- codingutf-8 -*- # # author: Ruben # mail: 773849069qq.com # time: 2023/12/8 # u""" 一个托盘图标的小部件 """ from Qt import QtWidgets, QtGui, QtCore# --*--*--*--*--*--*--*--*--*--…...

什么是纯净IP?如何判断IP地址的纯净度?有哪些干净IP推荐?

您是否想知道什么使代理“干净”或如何确保您的代理不会将您列入网站的黑名单&#xff1f;对于通过代理访问网络的人来说&#xff0c;干净的代理是无缝在线体验的重要组成部分。在这篇文章中&#xff0c;我们将深入研究干净代理的世界&#xff0c;并探讨决定其质量的因素。 一、…...

MySQL和Minio数据备份

文章目录 一、MySQL数据备份1. MySQL客户端2. 数据增量备份3. 数据增量还原4. 数据全量备份5. 数据全量还原 二、Minio数据备份1. Minio客户端2. 数据备份3. 数据还原 三、其他参考1. 设置定时备份2. 数据拷贝到其他服务器3. MySQL其他语句 一、MySQL数据备份 Linux环境&#…...

在Go中过滤范型集合:性能回顾

在一个真实的 Golang 场景中使用泛型&#xff0c;同时寻找与 Stream filter(Predicate<? super T> predicate)和 Python list comprehension 等同的函数。我没有依赖现有的包&#xff0c;而是选择自己写一个过滤函数&#xff0c;以达到学习的目的 func filterStrings(c…...

MATLAB 最小二乘直线拟合方法二 (36)

MATLAB 最小二乘直线拟合方法二 (36) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 这里介绍另一种拟合直线点云的方法,更为简单方便,结果与前者一致,主要内容直接复制代码使用即可,原理简单看代码即可,下面是具体的实现和拟合结果展示 二、算法实现 1.代码 代…...

Python 实现:OCR在图片中提取文字(基于Gradio实现)

Paddle OCR PaddleOCR 基于深度学习技术实现的&#xff0c;使用十分简单。 先看效果 可以看出来识别效果还是不错的&#xff0c;里面的“湿”字识别成了繁体字。如果不是连体字&#xff0c;就不会出现这个问题。 1.测试环境 操作系统&#xff1a;Win10 Python&#xff1a;3…...

idea插件开发报错: ZipException opening “slf4j.jar“: zip END header not found

错误信息 E:\idea-workspace\#idea-plugin\JSON2Object\src\main\java\com\hgy\plugin\json2object\GenerateAction.java:1: 错误: 无法访问com.hgy.plugin.json2object package com.hgy.plugin.json2object; ^ZipException opening "slf4j.jar": zip END header no…...

【Linux】多线程编程

目录 1. 线程基础知识 2. 线程创建 3. 线程ID&#xff08;TID&#xff09; 4. 线程终止 5. 线程取消 6. 线程等待 7. 线程分离 8. 线程互斥 8.1 初始化互斥量 8.2 销毁互斥量 8.3 互斥量加锁和解锁 9. 可重入和线程安全 10. 线程同步之条件变量 10.1 初始化条件变…...

【Mysql】InnoDB的表空间(九)

概述 表空间是一个在 InnoDB 中比较抽象的概念&#xff0c;对于系统表空间来说&#xff0c;对应着文件系统中一个或多个实际文件&#xff1b;而对于每个独立表空间来说&#xff0c;对应着文件系统中一个名为表名.ibd 的实际文件。可以把表空间想象成由很多个页组成的池子&…...

【09】ES6:Set 和 Map 数据结构

一、Set 1、基本语法 定义 Set 是一系列无序、没有重复值的数据集合。数组是一系列有序&#xff08;下标索引&#xff09;的数据集合。 Set 本身是一个构造函数&#xff0c;用来生成 Set 数据结构。 const s new Set() [2, 3, 5, 4, 5, 2, 2].forEach(x > s.add(x))fo…...

Java通过documents4j和libreoffice把word转为pdf

文章目录 word转pdf的相关第三方jar说明Linux系统安装LibreOffice在线安装离线安装word转pdf验证 Java工具类代码 word转pdf的相关第三方jar说明 docx4j 免费开源、稍微复杂点的word&#xff0c;样式完全乱了&#xff0c;且xalan升级为2.7.3后会报错。poi 免费开源、官方文档少…...

物联网时代的访问控制研究综述

A survey on Access Control in the Age of Internet of Things 文章目录 A B S T R A C T引言A. Comparison Between This Paper and Existing SurveysB. Contributions II.ACCESS CONTROL BACKGROUNDIII. ACCESS CONTROL CHALLENGES IN IOT SEARCHA. Characteristics of IoT …...

【产品经理】需求池和版本树

在这个人人都是产品经理的时代&#xff0c;每位入行的产品人进阶速度与到达高度各有不同。本文作者结合自身三年产品行业的经历&#xff0c;根据案例拆解产品行业的极简研发过程、需求池、版本树、产品自我优化等相关具体方法论。 一、产品研发的极简过程 1. 产品概述 产品就…...

Qt图像处理-OpenCv中Mat与QImage互转

Qt图像处理时需要OpenCv中Mat与QImage互转,具体代码如下 创建EditPhoto,头文件,使用前需要配置好opencv #include <QObject> #include <QImage> #include <QDebug>#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> …...

构建外卖小程序:技术代码实践

在这个数字化的时代&#xff0c;外卖小程序已经成为餐饮业的一项重要工具。在本文中&#xff0c;我们将通过一些简单而实用的技术代码&#xff0c;向您展示如何构建一个基本的外卖小程序。我们将使用微信小程序平台作为例子&#xff0c;但这些原理同样适用于其他小程序平台。 …...

IDEA中显示方法、类注释信息

目录 一、IDEA测试版本及环境二、操作步骤2.1 鼠标悬停在某一个方法上&#xff0c;从而显示方法的注释信息2.2 调用方法时同步显示方法注释信息2.3 在new一个对象时&#xff0c;这个对象有很多重载的构造方法&#xff0c;想要重载的构造函数都显示出来 一、IDEA测试版本及环境 …...

《数据结构、算法与应用C++语言描述》- 堆排序 - 借助priority_queue的C++实现

堆排序 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_27HeapSort 定义 借助堆进行排序。先用n个待排序的元素初始化一个小根堆&#xff0c;然后从堆中逐个提取(即删除元素)元素。初始化的时间复杂度为O(n)&#xff0c;大根堆中每…...

10.CSS浮动

CSS浮动 1.介绍 在最初&#xff0c;浮动是用来实现文字环绕图片效果的&#xff0c;现在浮动是主流的页面布局方式之一 2.作用 让元素脱离标准流&#xff0c;同一级的浮动的元素可以并排在一排显示 3.元素浮动后的特点 脱离文档流不管浮动前是什么元素&#xff0c;浮动后&…...

Angular 2 学习笔记

Angular 2 应用主要由以下 几个部分组成&#xff1a; 1、模块 (Modules)&#xff1a; 2、组件 (Components)&#xff1a; 3、模板 (Templates)​​​​​​​&#xff1a; 4、元数据 (Metadata)&#xff1a; 5、数据绑定 (Data Binding) 6、指令 (Directives) 7、服务 (Servic…...

xcode 修改 target 中设备朝向崩溃

修改xcode的target中的设备朝向导致崩溃。 从日志上看好像没有什么特别的信息。 之后想了想&#xff0c;感觉这个应该还是跟xcode的配置有关系&#xff0c;不过改动的地方好像也只有plist。 就又翻腾了半天plist中的各种配置项&#xff0c;再把所有的用户权限提示相关的东西之…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...