前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PyQt5实现仿QQ贴边隐藏功能的实例代码

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

作者头像
砸漏
发布2020-11-02 14:29:04
8540
发布2020-11-02 14:29:04
举报
文章被收录于专栏:恩蓝脚本

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

变换颜色思路

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

实现代码

代码语言:javascript
复制
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判断是否该显示

代码语言:javascript
复制
def enterEvent(self, event):
 self.hide_or_show('show', event)

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

代码语言:javascript
复制
def leaveEvent(self, event):
 self.hide_or_show('hide', event)

鼠标点击事件

代码语言:javascript
复制
def mousePressEvent(self, event):
 if event.button() == Qt.LeftButton:
  self.dragPosition = event.globalPos() - self.frameGeometry(
  ).topLeft()
  QApplication.postEvent(self, QEvent(174))
  event.accept()

捕捉鼠标移动事件

代码语言:javascript
复制
def mouseMoveEvent(self, event):
 if event.buttons() == Qt.LeftButton:
  try:
  self.move(event.globalPos() - self.dragPosition)
  event.accept()
  except:pass

判断是否该隐藏

代码语言:javascript
复制
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

将划入划出作为属性动画

代码语言:javascript
复制
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()

完整代码

代码语言:javascript
复制
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实现隐藏内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档