源码

蓝奏云:https://wwbx.lanzoul.com/b037wmw7e

密码:adro

从上一章开始看

本章我们需要正在上一章的基础上来做调整,所以还没有看过上一章的朋友可以回头看看

【PySide6】二、无边框拉伸窗口

为什么要设置系统托盘

主要是为了软件能在后台运行,并且能更加方便的从后台转为前台

为托盘菜单添加样式

代码

import sys
from PySide6.QtWidgets import *
from PySide6.QtGui import *
from PySide6.QtCore import *
from ui import ui_main_win# 主窗口
class main_win(QWidget):def __init__(self,parent = None):# 从文件中加载UI定义super(main_win, self).__init__(parent)self.ui = ui_main_win.Ui_Form()self.ui.setupUi(self)self.setWindowFlag(Qt.FramelessWindowHint)        #将界面设置为无框self.setAttribute(Qt.WA_TranslucentBackground)    #将界面属性设置为半透明self.shadow = QGraphicsDropShadowEffect()        #设定一个阴影,半径为 4,颜色为 2, 10, 25,偏移为 0,0self.shadow.setBlurRadius(4)self.shadow.setColor(QColor(2, 10, 25))self.shadow.setOffset(0, 0)self.ui.frame.setGraphicsEffect(self.shadow)    #为frame设定阴影效果# 按钮绑定退出信号# self.ui.pushButton_2.clicked.connect(app.quit)# 更改按钮为绑定关闭窗口信号self.ui.pushButton_2.clicked.connect(self.close)# 开启鼠标跟踪后,鼠标离开窗口或进入窗口会触发 mouseMoveEvent 事件self.setMouseTracking(True)# 初始化各扳机的状态self.initDrag()# 主窗口绑定事件过滤器self.ui.frame.installEventFilter(self)  # 初始化事件过滤器# 托盘菜单初始化self.tray_icon()#   -------------------------------------------------托盘菜单功能-----------------------------------------------# 托盘菜单初始化def tray_icon(self):# 创建菜单的项目,并连接对应信号self.create_actions()# 把项目添加到菜单中( QMenu(self) )self.create_tray_icon()# 创建菜单的项目,并连接对应信号def create_actions(self):self._restore_action = QAction("显示主界面")self._restore_action.triggered.connect(self.showNormal)self._quit_action = QAction("退出")self._quit_action.triggered.connect(self.app_quit)# 把项目添加到菜单中( QMenu(self) )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 = QSystemTrayIcon()self._tray_icon.setIcon(QIcon(r'img\logo.png'))self._tray_icon.setContextMenu(self._tray_icon_menu)# 在系统托盘显示此对象self._tray_icon.show()# 动作信号self._tray_icon.activated.connect(self.iconActivated)# 动作信号def iconActivated(self,reason):# 输出在鼠标在托盘图标上的动作print(reason)# 双击if reason == QSystemTrayIcon.DoubleClick:if self._tray_icon.isVisible():self.showNormal()# 右击if reason == QSystemTrayIcon.Context:if self._tray_icon.isVisible():# 菜单跟随鼠标self._tray_icon_menu.exec(QPoint(QCursor.pos().x() - 55 ,QCursor.pos().y() - 90))else:self.hide()# 退出def app_quit(self):# 先释放资源再退出,用于解决退出后图标不消失的问题self._restore_action = Noneself._quit_action = Noneself._tray_icon = Noneself._tray_icon_menu = Noneapp.quit()#   -------------------------------------------------事件过滤器-------------------------------------------------def eventFilter(self, obj, event):# 事件过滤器,用于解决鼠标进入其它控件后还原为标准鼠标样式if isinstance(event, QEnterEvent):self.setCursor(Qt.ArrowCursor)return super().eventFilter(obj, event)#   -----------------------------------------------移动与拉伸功能------------------------------------------------# 初始化各扳机的状态def initDrag(self):self._move_drag = Falseself._corner_drag = Falseself._bottom_drag = Falseself._right_drag = False# 鼠标按下所执行的功能def mousePressEvent(self, event):# globalPos为鼠标位置 , pos 为窗口的位置 , m_Position 为鼠标在窗口中的位置  .x() .y() 获取事件中的坐标# 移动事件if event.button() == Qt.LeftButton and (event.globalPos() - self.pos()).x() < self.ui.frame.size().width() and (event.globalPos() - self.pos()).y() < self.ui.frame.size().height():self._move_drag = Trueself.m_Position = event.globalPos() - self.pos()event.accept()# 右下角边界拉伸事件if event.button() == Qt.LeftButton and (event.globalPos() - self.pos()).x() > self.ui.frame.size().width() and (event.globalPos() - self.pos()).y() > self.ui.frame.size().height():self._corner_drag = Trueevent.accept()# 下边界拉伸事件if event.button() == Qt.LeftButton and (event.globalPos() - self.pos()).x() < self.ui.frame.size().width() and (event.globalPos() - self.pos()).y() > self.ui.frame.size().height():self._bottom_drag = Trueevent.accept()# 右边界拉伸事件if event.button() == Qt.LeftButton and (event.globalPos() - self.pos()).x() > self.ui.frame.size().width() and (event.globalPos() - self.pos()).y() < self.ui.frame.size().height():self._right_drag = Trueevent.accept()# 鼠标移动所执行的功能def mouseMoveEvent(self, QMouseEvent):# 移动事件if Qt.LeftButton and self._move_drag:self.move(QMouseEvent.globalPos() - self.m_Position)QMouseEvent.accept()# 右下角边界拉伸事件if Qt.LeftButton and self._corner_drag:self.resize(QMouseEvent.pos().x()+10 , QMouseEvent.pos().y()+10)QMouseEvent.accept()# 下边界拉伸事件if Qt.LeftButton and self._bottom_drag:self.resize(self.width() , QMouseEvent.pos().y()+10)QMouseEvent.accept()# 右边界拉伸事件if Qt.LeftButton and self._right_drag:self.resize(QMouseEvent.pos().x()+10 , self.height())QMouseEvent.accept()# 获取鼠标在窗口中的位置来改变鼠标的图标# 右下角边界光标事件if (QMouseEvent.globalPos() - self.pos()).x() > self.ui.frame.size().width() and (QMouseEvent.globalPos() - self.pos()).y() > self.ui.frame.size().height():self.setCursor(Qt.SizeFDiagCursor)# 下边界光标事件elif (QMouseEvent.globalPos() - self.pos()).x() < self.ui.frame.size().width() and (QMouseEvent.globalPos() - self.pos()).y() > self.ui.frame.size().height():self.setCursor(Qt.SizeVerCursor)# 右边界光标事件elif (QMouseEvent.globalPos() - self.pos()).x() > self.ui.frame.size().width() and (QMouseEvent.globalPos() - self.pos()).y() < self.ui.frame.size().height():self.setCursor(Qt.SizeHorCursor)# 正常光标事件else:self.setCursor(Qt.ArrowCursor)# 鼠标弹起后,恢复各扳机的状态def mouseReleaseEvent(self, QMouseEvent):self._move_drag = Falseself._corner_drag = Falseself._bottom_drag = Falseself._right_drag = Falseif __name__ == '__main__':# 每一个 PySide6 应用都必须创建一个应用对象app = QApplication([])# 设置窗口图标:按下 Alt + Tab 能够看到的图标,图片必须为正方形app.setWindowIcon(QIcon(r'img\logo.png'))# 检测当前系统是否支持托盘功能if not QSystemTrayIcon.isSystemTrayAvailable():QMessageBox.critical(None, "系统托盘", "本系统检测不出系统托盘")sys.exit(1)# 使得程序能在后台运行,关闭最后一个窗口不退出程序QApplication.setQuitOnLastWindowClosed(False)main_win = main_win()main_win.show()sys.exit(app.exec())

下期预告

下一期为:多窗口

【PySide6】三、设置系统托盘相关推荐

  1. MFC系统托盘的实现

    通常电脑里边的软件,当你打开后会在电脑最右下角的任务栏上生成一个系统托盘,当你点击最小化或者点击关闭按钮后,若想恢复窗口,可以左键双击或者单机这个系统图标,同时鼠标右键点击,又会有其他的菜单弹出,比如 ...

  2. Qt 数据服务器、协议转换、系统托盘模块、CAN总线模块、反射内存卡模块

    简单介绍 这个程序也不怎么复杂,就则一个界面,核心功能呢就是提供反射内存卡和CAN采集卡数据交互,其他的没有了. 今天主要是实现了这个程序启动以后最小化到系统托盘,在系统托盘的图标上面加上显示主界面选 ...

  3. QSystemTrayIcon——实现系统托盘

    QSystemTrayIcon类 QSystemTrayIcon QSystemTrayIcon是qt中专门用于处理系统托盘的类 头文件 #include qmake QT += widgets Si ...

  4. [JAVA]从零开始的“桌面宠物”之路(二):系统托盘与任务栏

    >今天的目标 在Window系统下,打开QQ宠物,我们并不能再任务栏看到相关的窗口.这也很好理解,毕竟桌面宠物就相当于一个桌面挂件,如果这个挂件侵入到我们的工作区(任务栏),就很烦,也很影响工作 ...

  5. swt中系统托盘Tray的实现

    在做gui界面的时候,系统托盘是屡见不鲜的功能,也是通用的.基础的功能之一,什么叫做系统托盘呢?就是最小化之后在右下角有个小图标可以还原: 这样的效果在swt中是怎么实现的呢?这里需要用到swt中的T ...

  6. java对托盘加监听右击报错_java实现系统托盘示例

    桌面的系统托盘即当程序最小化或者关闭按钮程序并没有退出,而是最小化在任务状态区域(Windows系统),当鼠标点击那个区域所在的图标有提示以及其他的操作.在 Microsoft Windows 上,它 ...

  7. linux mint输入法托盘,linux mint12安装ibus之后,语言栏不跟随光标和系统托盘输入法图标不能显示问题解决...

    安装之后,ibus有两个问题:1,语言栏不能光标跟随:2,系统托盘上不能显示输入法图标 对第一个问题, 我看到这个解决方法,之后便感觉应该是这几个系统变量没有设置好的原因. 用echo 查看了一下这三 ...

  8. qt修改程序图标名称_解决Qt应用程序添加icon图标,修改窗口图标以及添加系统托盘问题...

    一.Qt应用程序添加icon图标的方法: 首先,我们需要先准备两个文件,一个是icon图标,另一个是rc文件,我分别命名为"myApp.rc"和"soft.ico&quo ...

  9. VC 系统托盘 气泡提示

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 系统环境 ...

最新文章

  1. mysql 无法登陆_MySQL root用户无法登录原因及解决办法
  2. MongoDB 计划缓存的影响
  3. [译] Flutter 从 0 到 1, 第二部分
  4. c# 之Web.config
  5. 【转】TCP的SEQ和ACK的生成
  6. 控制台下修改系统驱动状态的代码
  7. BootstrapTable组件冻结列
  8. GNU Linux系统变量(sysctl配置命令)综合使用
  9. ubuntu的apt源
  10. CausalImpact
  11. YY协议官方下载|YY协议|YY协议下载|唯一官方网站www.yyfass.com
  12. 你可能不知道的印度手机市场
  13. 网页游戏常见外挂原理及防御
  14. Sulfo CY5-MAL|磺基-CY5 马来酰亚胺
  15. Qt下绘制PPI扫描的雷达图
  16. 浅析RTB和RTA(一)
  17. Java并发框架——AQS阻塞队列管理(三)——CLH锁改造
  18. Android 扫码盒子全局接收付款码(全局事件上层接收多重下发)
  19. Show 与 ShowModal 区别
  20. arnold如何设置鱼眼相机_Arnold(C4DToA)阿诺德渲染教程(51) – 常规摄像机 persp_camera 官方文档...

热门文章

  1. Type A卡和Type B卡的主要区别
  2. 一般mysql的客户端用什么软件_mysql一般用什么管理工具?
  3. keyPress事件与KeyPressEventArgs
  4. 织梦系统(DEDECMS)后台模板修改一
  5. 2019年全国电子设计大赛综合测评感悟
  6. 如果是有意隐藏,请使用关键字 new。
  7. php对接支付宝当面付接口视频教程,支付宝当面付接口demo(面对面扫码支付)
  8. 功能: Form窗口最大化时,控件相对位置变化的问题 (学习日记2016-12-23)
  9. Windows平台mantis安装
  10. 教您正确理解时钟器件的抖动性能