当前位置: 首页 > 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_()
http://www.lryc.cn/news/260025.html

相关文章:

  • 什么是纯净IP?如何判断IP地址的纯净度?有哪些干净IP推荐?
  • MySQL和Minio数据备份
  • 在Go中过滤范型集合:性能回顾
  • MATLAB 最小二乘直线拟合方法二 (36)
  • Python 实现:OCR在图片中提取文字(基于Gradio实现)
  • idea插件开发报错: ZipException opening “slf4j.jar“: zip END header not found
  • 【Linux】多线程编程
  • 【Mysql】InnoDB的表空间(九)
  • 【09】ES6:Set 和 Map 数据结构
  • Java通过documents4j和libreoffice把word转为pdf
  • 物联网时代的访问控制研究综述
  • 【产品经理】需求池和版本树
  • Qt图像处理-OpenCv中Mat与QImage互转
  • 构建外卖小程序:技术代码实践
  • IDEA中显示方法、类注释信息
  • 《数据结构、算法与应用C++语言描述》- 堆排序 - 借助priority_queue的C++实现
  • 10.CSS浮动
  • Angular 2 学习笔记
  • xcode 修改 target 中设备朝向崩溃
  • ZLMediaKit 编译以及测试(Centos 7.9 环境)
  • 汽车清除积碳和清洗节气门
  • RocketMQ 总体概括
  • 使用qemu在arm上模拟x86并运行docker
  • IIS配置多域名跨域
  • el-form表单校验输入框值为0时 提示校验不通过
  • Vue3后台管理-项目总结
  • 利用Pytorch预训练模型进行图像分类
  • MSF学习
  • Mybatis与Spring结合深探——MapperFactoryBean的奥秘
  • processon使用及流程图和泳道图的绘画(登录界面流程图,门诊流程图绘制门诊泳道图,住院泳道图,OA会议泳道图),Axure自定义元件