Pyqt实现无边框窗口拖动以及窗口大小改变
本文实例为大家分享了Pyqt实现无边框窗口拖动及大小改变的具体代码,供大家参考,具体内容如下
做个记录,绘制边框阴影可以忽略这里不是主要
根据网上某位仁兄Qt的实现转过来的大笑,上完整代码
#coding:utf-8 fromPyQt4.Qtimport* importsys PADDING=4 sys.setrecursionlimit(10000) classShadowWidget(QWidget): def__init__(self,parent=None): super(ShadowWidget,self).__init__(parent) self.setWindowFlags(Qt.FramelessWindowHint|Qt.WindowSystemMenuHint) self.setAttribute(Qt.WA_TranslucentBackground) self.SHADOW_WIDTH=0#边框距离 self.isLeftPressDown=False#鼠标左键是否按下 self.dragPosition=0#拖动时坐标 self.Numbers=self.enum(UP=0,DOWN=1,LEFT=2,RIGHT=3,LEFTTOP=4,LEFTBOTTOM=5,RIGHTBOTTOM=6,RIGHTTOP=7,NONE=8)#枚举参数 self.setMinimumHeight(500)#窗体最小高度 self.setMinimumWidth(1000)#窗体最小宽度 self.dir=self.Numbers.NONE#初始鼠标状态 self.setMouseTracking(True) #绘制边框阴影 defdrawShadow(self,painter): #绘制左上角、左下角、右上角、右下角、上、下、左、右边框 self.pixmaps=QStringList() self.pixmaps.append(QString("./img/border/left_top.png")) self.pixmaps.append(QString("./img/border/left_bottom.png")) self.pixmaps.append(QString("./img/border/right_top.png")) self.pixmaps.append(QString("./img/border/right_bottom.png")) self.pixmaps.append(QString("./img/border/top_mid.png")) self.pixmaps.append(QString("./img/border/bottom_mid.png")) self.pixmaps.append(QString("./img/border/left_mid.png")) self.pixmaps.append(QString("./img/border/right_mid.png")) painter.drawPixmap(0,0,self.SHADOW_WIDTH,self.SHADOW_WIDTH,QPixmap(self.pixmaps[0]))#左上角 painter.drawPixmap(self.width()-self.SHADOW_WIDTH,0,self.SHADOW_WIDTH,self.SHADOW_WIDTH,QPixmap(self.pixmaps[2]))#右上角 painter.drawPixmap(0,self.height()-self.SHADOW_WIDTH,self.SHADOW_WIDTH,self.SHADOW_WIDTH,QPixmap(self.pixmaps[1]))#左下角 painter.drawPixmap(self.width()-self.SHADOW_WIDTH,self.height()-self.SHADOW_WIDTH,self.SHADOW_WIDTH,self.SHADOW_WIDTH,QPixmap(self.pixmaps[3]))#右下角 painter.drawPixmap(0,self.SHADOW_WIDTH,self.SHADOW_WIDTH,self.height()-2*self.SHADOW_WIDTH,QPixmap(self.pixmaps[6]).scaled(self.SHADOW_WIDTH,self.height()-2*self.SHADOW_WIDTH))#左 painter.drawPixmap(self.width()-self.SHADOW_WIDTH,self.SHADOW_WIDTH,self.SHADOW_WIDTH,self.height()-2*self.SHADOW_WIDTH,QPixmap(self.pixmaps[7]).scaled(self.SHADOW_WIDTH,self.height()-2*self.SHADOW_WIDTH))#右 painter.drawPixmap(self.SHADOW_WIDTH,0,self.width()-2*self.SHADOW_WIDTH,self.SHADOW_WIDTH,QPixmap(self.pixmaps[4]).scaled(self.width()-2*self.SHADOW_WIDTH,self.SHADOW_WIDTH))#上 painter.drawPixmap(self.SHADOW_WIDTH,self.height()-self.SHADOW_WIDTH,self.width()-2*self.SHADOW_WIDTH,self.SHADOW_WIDTH,QPixmap(self.pixmaps[5]).scaled(self.width()-2*self.SHADOW_WIDTH,self.SHADOW_WIDTH))#下 #枚举参数 defenum(self,**enums): returntype('Enum',(),enums) defregion(self,cursorGlobalPoint): #获取窗体在屏幕上的位置区域,tl为topleft点,rb为rightbottom点 rect=self.rect() tl=self.mapToGlobal(rect.topLeft()) rb=self.mapToGlobal(rect.bottomRight()) x=cursorGlobalPoint.x() y=cursorGlobalPoint.y() if(tl.x()+PADDING>=xandtl.x()<=xandtl.y()+PADDING>=yandtl.y()<=y): #左上角 self.dir=self.Numbers.LEFTTOP self.setCursor(QCursor(Qt.SizeFDiagCursor))#设置鼠标形状 elif(x>=rb.x()-PADDINGandx<=rb.x()andy>=rb.y()-PADDINGandy<=rb.y()): #右下角 self.dir=self.Numbers.RIGHTBOTTOM self.setCursor(QCursor(Qt.SizeFDiagCursor)) elif(x<=tl.x()+PADDINGandx>=tl.x()andy>=rb.y()-PADDINGandy<=rb.y()): #左下角 self.dir=self.Numbers.LEFTBOTTOM self.setCursor(QCursor(Qt.SizeBDiagCursor)) elif(x<=rb.x()andx>=rb.x()-PADDINGandy>=tl.y()andy<=tl.y()+PADDING): #右上角 self.dir=self.Numbers.RIGHTTOP self.setCursor(QCursor(Qt.SizeBDiagCursor)) elif(x<=tl.x()+PADDINGandx>=tl.x()): #左边 self.dir=self.Numbers.LEFT self.setCursor(QCursor(Qt.SizeHorCursor)) elif(x<=rb.x()andx>=rb.x()-PADDING): #右边 self.dir=self.Numbers.RIGHT self.setCursor(QCursor(Qt.SizeHorCursor)) elif(y>=tl.y()andy<=tl.y()+PADDING): #上边 self.dir=self.Numbers.UP self.setCursor(QCursor(Qt.SizeVerCursor)) elif(y<=rb.y()andy>=rb.y()-PADDING): #下边 self.dir=self.Numbers.DOWN self.setCursor(QCursor(Qt.SizeVerCursor)) else: #默认 self.dir=self.Numbers.NONE self.setCursor(QCursor(Qt.ArrowCursor)) defmouseReleaseEvent(self,event): if(event.button()==Qt.LeftButton): self.isLeftPressDown=False if(self.dir!=self.Numbers.NONE): self.releaseMouse() self.setCursor(QCursor(Qt.ArrowCursor)) defmousePressEvent(self,event): if(event.button()==Qt.LeftButton): self.isLeftPressDown=True if(self.dir!=self.Numbers.NONE): self.mouseGrabber() else: self.dragPosition=event.globalPos()-self.frameGeometry().topLeft() defmouseMoveEvent(self,event): gloPoint=event.globalPos() rect=self.rect() tl=self.mapToGlobal(rect.topLeft()) rb=self.mapToGlobal(rect.bottomRight()) if(notself.isLeftPressDown): self.region(gloPoint) else: if(self.dir!=self.Numbers.NONE): rmove=QRect(tl,rb) if(self.dir==self.Numbers.LEFT): if(rb.x()-gloPoint.x()<=self.minimumWidth()): rmove.setX(tl.x()) else: rmove.setX(gloPoint.x()) elif(self.dir==self.Numbers.RIGHT): printu"youbian" rmove.setWidth(gloPoint.x()-tl.x()) elif(self.dir==self.Numbers.UP): if(rb.y()-gloPoint.y()<=self.minimumHeight()): rmove.setY(tl.y()) else: rmove.setY(gloPoint.y()) elif(self.dir==self.Numbers.DOWN): rmove.setHeight(gloPoint.y()-tl.y()) elif(self.dir==self.Numbers.LEFTTOP): if(rb.x()-gloPoint.x()<=self.minimumWidth()): rmove.setX(tl.x()) else: rmove.setX(gloPoint.x()) if(rb.y()-gloPoint.y()<=self.minimumHeight()): rmove.setY(tl.y()) else: rmove.setY(gloPoint.y()) elif(self.dir==self.Numbers.RIGHTTOP): rmove.setWidth(gloPoint.x()-tl.x()) rmove.setY(gloPoint.y()) elif(self.dir==self.Numbers.LEFTBOTTOM): rmove.setX(gloPoint.x()) rmove.setHeight(gloPoint.y()-tl.y()) elif(self.dir==self.Numbers.RIGHTBOTTOM): rmove.setWidth(gloPoint.x()-tl.x()) rmove.setHeight(gloPoint.y()-tl.y()) else: pass self.setGeometry(rmove) else: self.move(event.globalPos()-self.dragPosition) event.accept() if__name__=='__main__': app=QApplication(sys.argv) shadow=ShadowWidget() shadow.show() sys.exit(app.exec_())
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。