Pyqt實(shí)現(xiàn)無(wú)邊框窗口拖動(dòng)以及窗口大小改變
本文實(shí)例為大家分享了Pyqt實(shí)現(xiàn)無(wú)邊框窗口拖動(dòng)及大小改變的具體代碼,供大家參考,具體內(nèi)容如下
做個(gè)記錄,繪制邊框陰影可以忽略這里不是主要
根據(jù)網(wǎng)上某位仁兄Qt的實(shí)現(xiàn)轉(zhuǎn)過(guò)來(lái)的大笑,上完整代碼
# coding:utf-8 from PyQt4.Qt import * import sys PADDING=4 sys.setrecursionlimit(10000) class ShadowWidget(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 #鼠標(biāo)左鍵是否按下 self.dragPosition=0 #拖動(dòng)時(shí)坐標(biāo) self.Numbers = self.enum(UP=0, DOWN=1, LEFT=2, RIGHT=3, LEFTTOP=4, LEFTBOTTOM=5, RIGHTBOTTOM=6, RIGHTTOP=7, NONE=8) #枚舉參數(shù) self.setMinimumHeight(500) #窗體最小高度 self.setMinimumWidth(1000) #窗體最小寬度 self.dir=self.Numbers.NONE #初始鼠標(biāo)狀態(tài) self.setMouseTracking(True) #繪制邊框陰影 def drawShadow(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)) #下 #枚舉參數(shù) def enum(self,**enums): return type('Enum', (), enums) def region(self,cursorGlobalPoint): #獲取窗體在屏幕上的位置區(qū)域,tl為topleft點(diǎn),rb為rightbottom點(diǎn) rect = self.rect() tl = self.mapToGlobal(rect.topLeft()) rb = self.mapToGlobal(rect.bottomRight()) x = cursorGlobalPoint.x() y = cursorGlobalPoint.y() if(tl.x() + PADDING >= x and tl.x() <= x and tl.y() + PADDING >= y and tl.y() <= y): #左上角 self.dir = self.Numbers.LEFTTOP self.setCursor(QCursor(Qt.SizeFDiagCursor)) #設(shè)置鼠標(biāo)形狀 elif(x >= rb.x() - PADDING and x <= rb.x() and y >= rb.y() - PADDING and y <= rb.y()): #右下角 self.dir = self.Numbers.RIGHTBOTTOM self.setCursor(QCursor(Qt.SizeFDiagCursor)) elif(x <= tl.x() + PADDING and x >= tl.x() and y >= rb.y() - PADDING and y <= rb.y()): #左下角 self.dir = self.Numbers.LEFTBOTTOM self.setCursor(QCursor(Qt.SizeBDiagCursor)) elif(x <= rb.x() and x >= rb.x() - PADDING and y >= tl.y() and y <= tl.y() + PADDING): #右上角 self.dir = self.Numbers.RIGHTTOP self.setCursor(QCursor(Qt.SizeBDiagCursor)) elif(x <= tl.x() + PADDING and x >= tl.x()): #左邊 self.dir = self.Numbers.LEFT self.setCursor(QCursor(Qt.SizeHorCursor)) elif( x <= rb.x() and x >= rb.x() - PADDING): #右邊 self.dir = self.Numbers.RIGHT self.setCursor(QCursor(Qt.SizeHorCursor)) elif(y >= tl.y() and y <= tl.y() + PADDING): #上邊 self.dir = self.Numbers.UP self.setCursor(QCursor(Qt.SizeVerCursor)) elif(y <= rb.y() and y >= rb.y() - PADDING): #下邊 self.dir = self.Numbers.DOWN self.setCursor(QCursor(Qt.SizeVerCursor)) else: #默認(rèn) self.dir = self.Numbers.NONE self.setCursor(QCursor(Qt.ArrowCursor)) def mouseReleaseEvent(self,event): if(event.button() == Qt.LeftButton): self.isLeftPressDown = False if(self.dir != self.Numbers.NONE): self.releaseMouse() self.setCursor(QCursor(Qt.ArrowCursor)) def mousePressEvent(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() def mouseMoveEvent(self,event): gloPoint = event.globalPos() rect = self.rect() tl = self.mapToGlobal(rect.topLeft()) rb = self.mapToGlobal(rect.bottomRight()) if(not self.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): print u"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_())
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)七大查找算法的示例代碼
這篇文章主要介紹了Python實(shí)現(xiàn)七大查找算法的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Python中的復(fù)雜數(shù)據(jù)類型(list、tuple)
這篇文章介紹了Python中的復(fù)雜數(shù)據(jù)類型(list、tuple),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05基于Python實(shí)現(xiàn)四維圖像繪制系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何基于Python語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的四維圖像繪制系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-09-097個(gè)實(shí)用的Python自動(dòng)化代碼別再重復(fù)造輪子了
關(guān)于Python有一句名言:不要重復(fù)造輪子,給大家分享經(jīng)過(guò)Python3.6.4調(diào)試通過(guò)的代碼,感興趣的朋友跟隨小編一起看看吧2023-11-11python3基于TCP實(shí)現(xiàn)CS架構(gòu)文件傳輸
這篇文章主要為大家詳細(xì)介紹了python3基于TCP實(shí)現(xiàn)CS架構(gòu)文件傳輸,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07使用IPython或Spyder將省略號(hào)表示的內(nèi)容完整輸出
這篇文章主要介紹了使用IPython或Spyder將省略號(hào)表示的內(nèi)容完整輸出,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04恢復(fù)百度云盤(pán)本地誤刪的文件腳本(簡(jiǎn)單方法)
下面小編就為大家?guī)?lái)一篇恢復(fù)百度云盤(pán)本地誤刪的文件腳本(簡(jiǎn)單方法)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10