PyQt5实现仿QQ贴边隐藏功能的实例代码
此程序大致功能为:可变换颜色,贴边隐藏。
变换颜色思路
QPalette([ˈpælət]调色板)类相当于对话框或控件的调色板,它管理着控件或窗体的所有颜色信息,每个窗体或控件都包含一个QPalette对象,在显示时按照它的QPalette对象中对各部分各状态下的颜色的描述来进行绘制。
实现代码
defPainting(self): color=random.choice(["CCFFFF","CC6699","CC99FF","99CCFF"]) palette1=QPalette() palette1.setColor(self.backgroundRole(), QColor("#{}".format(color)))#改变窗体颜色 self.setPalette(palette1)
贴边隐藏思路
可以判断窗口的位置,当与边缘的距离小于某值时,再判断鼠标是否在窗口,判断是否隐藏窗口;
根据隐藏窗口的隐藏位置,获得某块区域,当鼠标在这个位置时,显示窗口。
实现代码
鼠标进入事件,调用hide_or_show判断是否该显示
defenterEvent(self,event): self.hide_or_show('show',event)
鼠标离开事件,调用hide_or_show判断是否该隐藏
defleaveEvent(self,event): self.hide_or_show('hide',event)
鼠标点击事件
defmousePressEvent(self,event): ifevent.button()==Qt.LeftButton: self.dragPosition=event.globalPos()-self.frameGeometry( ).topLeft() QApplication.postEvent(self,QEvent(174)) event.accept()
捕捉鼠标移动事件
defmouseMoveEvent(self,event): ifevent.buttons()==Qt.LeftButton: try: self.move(event.globalPos()-self.dragPosition) event.accept() except:pass
判断是否该隐藏
defhide_or_show(self,mode,event): pos=self.frameGeometry().topLeft() ifmode=='show'andself.moved: ifpos.x()+WINDOW_WEIGHT>=SCREEN_WEIGHT:#右侧显示 self.startAnimation(SCREEN_WEIGHT-WINDOW_WEIGHT+2,pos.y()) event.accept() self.moved=False elifpos.x()<=0:#左侧显示 self.startAnimation(0,pos.y()) event.accept() self.moved=False elifpos.y()<=0:#顶层显示 self.startAnimation(pos.x(),0) event.accept() self.moved=False elifmode=='hide': ifpos.x()+WINDOW_WEIGHT>=SCREEN_WEIGHT:#右侧隐藏 self.startAnimation(SCREEN_WEIGHT-2,pos.y()) event.accept() self.moved=True elifpos.x()<=2:#左侧隐藏 self.startAnimation(2-WINDOW_WEIGHT,pos.y()) event.accept() self.moved=True elifpos.y()<=2:#顶层隐藏 self.startAnimation(pos.x(),2-WINDOW_HEIGHT) event.accept() self.moved=True
将划入划出作为属性动画
defstartAnimation(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()
完整代码
importsys,random fromPyQt5.QtGuiimportQPalette,QColor fromPyQt5.QtWidgetsimportQWidget,QVBoxLayout,QPushButton,\ QDesktopWidget,QApplication fromPyQt5.QtCoreimportQt,QRect,QEvent,QPoint fromPyQt5.QtimportQCursor,QPropertyAnimation SCREEN_WEIGHT=1920 SCREEN_HEIGHT=1080 WINDOW_WEIGHT=300 WINDOW_HEIGHT=600 classUi_Form(QWidget): def__init__(self): self.moved=False super(Ui_Form,self).__init__() self.setupUi() self.resize(WINDOW_WEIGHT,WINDOW_HEIGHT) self.show() defsetupUi(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:1pxsolid#3f3f3f; padding:5px; min-height:20px; border-radius:15px; } ''') defPainting(self): color=random.choice(["CCFFFF","CC6699","CC99FF","99CCFF"]) palette1=QPalette() palette1.setColor(self.backgroundRole(), QColor("#{}".format(color)))#改变窗体颜色 self.setPalette(palette1) defenterEvent(self,event): self.hide_or_show('show',event) defleaveEvent(self,event): self.hide_or_show('hide',event) defmousePressEvent(self,event): ifevent.button()==Qt.LeftButton: self.dragPosition=event.globalPos()-self.frameGeometry( ).topLeft() QApplication.postEvent(self,QEvent(174)) event.accept() defmouseMoveEvent(self,event): ifevent.buttons()==Qt.LeftButton: try: self.move(event.globalPos()-self.dragPosition) event.accept() except:pass #defmouseReleaseEvent(self,event): #self.moved=True #self.hide_or_show('show',event) defhide_or_show(self,mode,event): pos=self.frameGeometry().topLeft() ifmode=='show'andself.moved: ifpos.x()+WINDOW_WEIGHT>=SCREEN_WEIGHT:#右侧显示 self.startAnimation(SCREEN_WEIGHT-WINDOW_WEIGHT+2,pos.y()) event.accept() self.moved=False elifpos.x()<=0:#左侧显示 self.startAnimation(0,pos.y()) event.accept() self.moved=False elifpos.y()<=0:#顶层显示 self.startAnimation(pos.x(),0) event.accept() self.moved=False elifmode=='hide': ifpos.x()+WINDOW_WEIGHT>=SCREEN_WEIGHT:#右侧隐藏 self.startAnimation(SCREEN_WEIGHT-2,pos.y()) event.accept() self.moved=True elifpos.x()<=2:#左侧隐藏 self.startAnimation(2-WINDOW_WEIGHT,pos.y()) event.accept() self.moved=True elifpos.y()<=2:#顶层隐藏 self.startAnimation(pos.x(),2-WINDOW_HEIGHT) event.accept() self.moved=True defstartAnimation(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实现隐藏内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!