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


Posted in Python onApril 19, 2018

本文实例为大家分享了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_())

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

Python 相关文章推荐
python抓取某汽车网数据解析html存入excel示例
Dec 04 Python
Python的Flask站点中集成xhEditor文本编辑器的教程
Jun 13 Python
Django 前后台的数据传递的方法
Aug 08 Python
Python3.5 处理文本txt,删除不需要的行方法
Dec 10 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
关于python下cv.waitKey无响应的原因及解决方法
Jan 10 Python
基于Python计算圆周率pi代码实例
Mar 25 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
Jun 06 Python
Python 私有属性和私有方法应用场景分析
Jun 19 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
Jul 03 Python
如何在python中实现线性回归
Aug 10 Python
pytorch简介
Nov 11 Python
Python利用pandas计算多个CSV文件数据值的实例
Apr 19 #Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
Apr 19 #Python
利用numpy和pandas处理csv文件中的时间方法
Apr 19 #Python
Python处理CSV与List的转换方法
Apr 19 #Python
python3+PyQt5重新实现QT事件处理程序
Apr 19 #Python
python3+PyQt5重新实现自定义数据拖放处理
Apr 19 #Python
python之从文件读取数据到list的实例讲解
Apr 19 #Python
You might like
php 搜索框提示(自动完成)实例代码
2012/02/05 PHP
php实现的ping端口函数实例
2014/11/12 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
2016/05/06 PHP
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
jQuery之选项卡的简单实现
2014/02/28 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
iScroll中事件点击触发两次解决方案
2015/03/11 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
2015/04/22 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
javascript获取以及设置光标位置
2017/02/16 Javascript
Vue实现路由跳转和嵌套
2017/06/20 Javascript
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
在Docker上开始部署Python应用的教程
2015/04/17 Python
Python标准库之Sys模块使用详解
2015/05/23 Python
Python内置模块logging用法实例分析
2018/02/12 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
python操作excel文件并输出txt文件的实例
2018/07/10 Python
python3.6的venv模块使用详解
2018/08/01 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
2019/08/28 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
python实现AdaBoost算法的示例
2020/10/03 Python
elf彩妆英国官网:e.l.f. Cosmetics英国(美国平价彩妆品牌)
2017/11/02 全球购物
Johnston & Murphy官网: 约翰斯顿·墨菲牛津总统鞋
2018/01/09 全球购物
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
美术专业学生个人自我评价
2013/09/19 职场文书
班级活动策划书
2014/02/06 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
2014年卫生工作总结
2014/11/27 职场文书
第四次工业革命,打工人与机器人的竞争
2022/04/21 数码科技