button 隐藏属性_PyQt5实现仿QQ贴边隐藏功能!有点意思

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


变换颜色

思路

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,randomfrom PyQt5.QtGui import QPalette,QColorfrom PyQt5.QtWidgets import QWidget,QVBoxLayout,QPushButton,    QDesktopWidget,QApplicationfrom PyQt5.QtCore import Qt,QRect,QEvent,QPointfrom PyQt5.Qt import QCursor,QPropertyAnimationSCREEN_WEIGHT = 1920SCREEN_HEIGHT = 1080WINDOW_WEIGHT = 300WINDOW_HEIGHT = 600class 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_())

源码获取加群哦:1136192749

bec5a978414efca172cc4db68cd37b2d.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值