PyQt5实现仿QQ贴边隐藏功能的实例代码


Posted in Python onMay 24, 2020

此程序大致功能为:可变换颜色,贴边隐藏。

变换颜色思路

QPalette( [ˈpælət] 调色板)类相当于对话框或控件的调色板,它管理着控件或窗体的所有颜色信息,每个窗体或控件都包含一个QPalette对象,在显示时按照它的QPalette对象中对各部分各状态下的颜色的描述来进行绘制。

实现代码

def Painting(self):
 color = random.choice(["CCFFFF","CC6699","CC99FF","99CCFF"])
 palette1 = QPalette()
 palette1.setColor(self.backgroundRole(),
    QColor("#{}".format(color))) # 改变窗体颜色
 self.setPalette(palette1)

贴边隐藏思路

可以判断窗口的位置,当与边缘的距离小于某值时,再判断鼠标是否在窗口,判断是否隐藏窗口;
根据隐藏窗口的隐藏位置,获得某块区域,当鼠标在这个位置时,显示窗口。

实现代码

鼠标进入事件,调用hide_or_show判断是否该显示

def enterEvent(self, event):
 self.hide_or_show('show', event)

鼠标离开事件,调用hide_or_show判断是否该隐藏

def leaveEvent(self, event):
 self.hide_or_show('hide', event)

鼠标点击事件

def mousePressEvent(self, event):
 if event.button() == Qt.LeftButton:
  self.dragPosition = event.globalPos() - self.frameGeometry(
  ).topLeft()
  QApplication.postEvent(self, QEvent(174))
  event.accept()

捕捉鼠标移动事件

def mouseMoveEvent(self, event):
 if event.buttons() == Qt.LeftButton:
  try:
  self.move(event.globalPos() - self.dragPosition)
  event.accept()
  except:pass

判断是否该隐藏

def hide_or_show(self, mode, event):
 pos = self.frameGeometry().topLeft()
 if mode == 'show' and self.moved:
  if pos.x() + WINDOW_WEIGHT >= SCREEN_WEIGHT: # 右侧显示
  self.startAnimation(SCREEN_WEIGHT - WINDOW_WEIGHT + 2, pos.y())
  event.accept()
  self.moved = False
  elif pos.x() <= 0: # 左侧显示
  self.startAnimation(0,pos.y())
  event.accept()
  self.moved = False
  elif pos.y() <= 0: # 顶层显示
  self.startAnimation(pos.x(),0)
  event.accept()
  self.moved = False
 elif mode == 'hide':
  if pos.x() + WINDOW_WEIGHT >= SCREEN_WEIGHT: # 右侧隐藏
  self.startAnimation(SCREEN_WEIGHT - 2,pos.y())
  event.accept()
  self.moved = True
  elif pos.x() <= 2: # 左侧隐藏
  self.startAnimation(2 - WINDOW_WEIGHT,pos.y())
  event.accept()
  self.moved = True
  elif pos.y() <= 2: # 顶层隐藏
  self.startAnimation(pos.x(),2 - WINDOW_HEIGHT)
  event.accept()
  self.moved = True

将划入划出作为属性动画

def startAnimation(self,width,height):
 animation = QPropertyAnimation(self,b"geometry",self)
 startpos = self.geometry()
 animation.setDuration(200)
 newpos = QRect(width,height,startpos.width(),startpos.height())
 animation.setEndValue(newpos)
 animation.start()

完整代码

import sys,random
from PyQt5.QtGui import QPalette,QColor
from PyQt5.QtWidgets import QWidget,QVBoxLayout,QPushButton,\
 QDesktopWidget,QApplication
from PyQt5.QtCore import Qt,QRect,QEvent,QPoint
from PyQt5.Qt import QCursor,QPropertyAnimation

SCREEN_WEIGHT = 1920
SCREEN_HEIGHT = 1080
WINDOW_WEIGHT = 300
WINDOW_HEIGHT = 600
class Ui_Form(QWidget):
 def __init__(self):
 self.moved = False
 super(Ui_Form,self).__init__()
 self.setupUi()
 self.resize(WINDOW_WEIGHT, WINDOW_HEIGHT)
 self.show()
 def setupUi(self):
 self.setWindowFlags(Qt.FramelessWindowHint
    | Qt.WindowStaysOnTopHint
    | Qt.Tool) # 去掉标题栏
 self.widget = QWidget()
 self.Layout = QVBoxLayout(self.widget)
 self.Layout.setContentsMargins(0,0,0,0)
 self.setLayout(self.Layout)
 self.setWindowFlag(Qt.Tool)
 self.main_widget = QWidget()
 self.Layout.addWidget(self.main_widget)
 self.paint = QPushButton(self.main_widget)
 self.paint.setText("改变颜色")
 self.paint.move(QPoint(120,200))
 self.paint.clicked.connect(self.Painting)
 self.exit = QPushButton(self.main_widget)
 self.exit.setText(" 退出 ")
 self.exit.move(QPoint(120,400))
 self.exit.clicked.connect(lambda:exit(0))
 self.setStyleSheet('''
  QPushButton {
  color: rgb(137, 221, 255);
  background-color: rgb(37, 121, 255);
  border-style:none;
  border:1px solid #3f3f3f;
  padding:5px;
  min-height:20px;
  border-radius:15px;
  }
  ''')
 def Painting(self):
 color = random.choice(["CCFFFF","CC6699","CC99FF","99CCFF"])
 palette1 = QPalette()
 palette1.setColor(self.backgroundRole(),
    QColor("#{}".format(color))) # 改变窗体颜色
 self.setPalette(palette1)
 def enterEvent(self, event):
 self.hide_or_show('show', event)
 def leaveEvent(self, event):
 self.hide_or_show('hide', event)
 def mousePressEvent(self, event):
 if event.button() == Qt.LeftButton:
  self.dragPosition = event.globalPos() - self.frameGeometry(
  ).topLeft()
  QApplication.postEvent(self, QEvent(174))
  event.accept()
 def mouseMoveEvent(self, event):
 if event.buttons() == Qt.LeftButton:
  try:
  self.move(event.globalPos() - self.dragPosition)
  event.accept()
  except:pass
 #def mouseReleaseEvent(self, event):
 #self.moved = True
 #self.hide_or_show('show', event)
 def hide_or_show(self, mode, event):
 pos = self.frameGeometry().topLeft()
 if mode == 'show' and self.moved:
  if pos.x() + WINDOW_WEIGHT >= SCREEN_WEIGHT: # 右侧显示
  self.startAnimation(SCREEN_WEIGHT - WINDOW_WEIGHT + 2, pos.y())
  event.accept()
  self.moved = False
  elif pos.x() <= 0: # 左侧显示
  self.startAnimation(0,pos.y())
  event.accept()
  self.moved = False
  elif pos.y() <= 0: # 顶层显示
  self.startAnimation(pos.x(),0)
  event.accept()
  self.moved = False
 elif mode == 'hide':
  if pos.x() + WINDOW_WEIGHT >= SCREEN_WEIGHT: # 右侧隐藏
  self.startAnimation(SCREEN_WEIGHT - 2,pos.y())
  event.accept()
  self.moved = True
  elif pos.x() <= 2: # 左侧隐藏
  self.startAnimation(2 - WINDOW_WEIGHT,pos.y())
  event.accept()
  self.moved = True
  elif pos.y() <= 2: # 顶层隐藏
  self.startAnimation(pos.x(),2 - WINDOW_HEIGHT)
  event.accept()
  self.moved = True
 def startAnimation(self,width,height):
 animation = QPropertyAnimation(self,b"geometry",self)
 startpos = self.geometry()
 animation.setDuration(200)
 newpos = QRect(width,height,startpos.width(),startpos.height())
 animation.setEndValue(newpos)
 animation.start()
if __name__ == "__main__":
 app = QApplication(sys.argv)
 ui = Ui_Form()
 sys.exit(app.exec_())

总结

到此这篇关于PyQt5实现仿QQ贴边隐藏功能的文章就介绍到这了,更多相关PyQt5实现隐藏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python 随机数生成的代码的详细分析
May 15 Python
python的常见命令注入威胁
Feb 18 Python
Saltstack快速入门简单汇总
Mar 01 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
Jun 29 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
Mar 12 Python
python中判断文件编码的chardet(实例讲解)
Dec 21 Python
Django自定义manage命令实例代码
Feb 11 Python
django实现HttpResponse返回json数据为中文
Mar 27 Python
在TensorFlow中实现矩阵维度扩展
May 22 Python
Pytorch实现将模型的所有参数的梯度清0
Jun 24 Python
python自动打开浏览器下载zip并提取内容写入excel
Jan 04 Python
python读取mat文件生成h5文件的实现
Jul 15 Python
通过Python扫描代码关键字并进行预警的实现方法
May 24 #Python
关于keras中keras.layers.merge的用法说明
May 23 #Python
使用keras2.0 将Merge层改为函数式
May 23 #Python
使用keras实现densenet和Xception的模型融合
May 23 #Python
在keras下实现多个模型的融合方式
May 23 #Python
Keras使用ImageNet上预训练的模型方式
May 23 #Python
使用Keras预训练模型ResNet50进行图像分类方式
May 23 #Python
You might like
PHP session有效期session.gc_maxlifetime
2011/04/20 PHP
Youku 视频绝对地址获取的方法详解
2013/06/26 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
ExtJS 2.0实用简明教程之应用ExtJS
2009/04/29 Javascript
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
JS简单计算器实例
2015/01/20 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
2017/01/04 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
js中forEach,for in,for of循环的用法示例小结
2020/03/14 Javascript
python中sleep函数用法实例分析
2015/04/29 Python
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
Python中多线程的创建及基本调用方法
2016/07/08 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
tensorflow 报错unitialized value的解决方法
2020/02/06 Python
python 读txt文件,按‘,’分割每行数据操作
2020/07/05 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
django下创建多个app并设置urls方法
2020/08/02 Python
迪奥官网:Dior.com
2018/12/04 全球购物
棉花姑娘教学反思
2014/02/15 职场文书
2014第二批党的群众路线教育实践活动对照检查材料思想汇报
2014/09/18 职场文书
工程承包协议书范本
2014/09/29 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
2014年数学教研组工作总结
2014/12/06 职场文书
大学生自荐材料范文
2014/12/30 职场文书
三方合作意向书范本
2015/05/09 职场文书
永远是春天观后感
2015/06/12 职场文书
捐书仪式主持词
2015/07/04 职场文书
2016幼儿园教师年度考核评语
2015/12/01 职场文书
解决SpringCloud Feign传对象参数调用失败的问题
2021/06/23 Java/Android
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android
MySQL 原理与优化之原数据锁的应用
2022/08/14 MySQL