侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Pyqt实现无边框窗口拖动以及窗口大小改变

Python  /  管理员 发布于 5年前   450

本文实例为大家分享了Pyqt实现无边框窗口拖动及大小改变的具体代码,供大家参考,具体内容如下

做个记录,绘制边框阴影可以忽略这里不是主要

根据网上某位仁兄Qt的实现转过来的大笑,上完整代码

# 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 #鼠标左键是否按下     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)    #绘制边框阴影   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))  #下    #枚举参数   def enum(self,**enums):     return type('Enum', (), enums)    def region(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 >= x and tl.x() <= x and tl.y() + PADDING >= y and tl.y() <= y):       #左上角       self.dir = self.Numbers.LEFTTOP       self.setCursor(QCursor(Qt.SizeFDiagCursor))  #设置鼠标形状     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:       #默认       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_()) 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    PyQt5每天必学之组合框
    下一条:
    PyQt5实现无边框窗口的标题拖动和窗口缩放
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客