Pyqt实现无边框窗口拖动以及窗口大小改变
作者:飞奔的猫 发布时间:2023-07-30 01:59:10
标签:Pyqt,窗口
本文实例为大家分享了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_())
来源:https://blog.csdn.net/jylonger/article/details/49665049
0
投稿
猜你喜欢
- 本文实例讲述了python函数enumerate,operator和Counter使用技巧。分享给大家供大家参考,具体如下:最近看人家的代码
- 处理json中不带双引号key问题在解析网页json数据的时候,我发现python标准库json模块无法加载数据。如下面数据import j
- 可能很多人遇到过这个错误,当使用setup.py安装python2.7图像处理模块PIL时,python默认会寻找电脑上以安装的vs2008
- 本文实例讲述了python创建一个最简单http webserver服务器的方法。分享给大家供大家参考。具体实现方法如下:import sy
- mysql4.1以上版本连接时出现Client does not support authentic
- 第一种是进行多项式拟合,数学上可以证明,任意函数都可以表示为多项式形式。具体示例如下。###拟合年龄import numpy as npim
- 我就废话不多说了,直接上代码吧:package mainimport ("flag""fmt"&qu
- 经常会遇到下载的文件或电子书,名字中间都包含了一些网址信息,实际使用中由于名字太长不方便,下面的脚本使用正则表达式来对目录下的所有文件重命名
- PIL:使用python自带图像处理库读取出来的图片格式numpy:使用python-opencv库读取出来的图片格式tensor:pyto
- 编程一直是在课余时间,放假时间自学,到现在为止也有半年了。这是我自己用python实现的连连看,也是第一个完成的游戏,虽然极其简陋。思路呢,
- django1.3新加入了一个静态资源管理的app,django.contrib.staticfiles。在以往的django版本中,静态资
- 本文主要介绍了python中读取和查看图片的6种方法,分享给大家,具体如下:file_name1='test_imgs/spect/
- 而Easp类中提供了大量实用的ASP通用过程及方法,可以简化大部分的ASP操作。目前只提供了VBScript版,JScript版将来可能会提
- 这些小东西是我在网上看到的就把它记下来了,可能以后会有用的: &nbs
- <!-- #include file="../conn.asp" --&
- 前面最近,看到不少小伙伴问pytorch如何保存和加载模型,其实这部分pytorch官网介绍的也是很清楚的,感兴趣的点击了解详情🥁🥁🥁但是肯
- 一、文件的编码计算机中有许多可用编码:UTF-8GBKBig5等UTF-8是目前全球通用的编码格式除非有特殊需求,否则,一律以UTF-8格式
- 下表列出了 Microsoft ACCESS 的命令行选项:选项 效果database 打开指定的 Microsoft Access 数据库
- 需求:对于一个python list 或者numpy数组,我需要找到这个list中最大的K个数及其对应的下标。解决方式:1. 可以构造字典通
- 前言本人是位大二在读在校学生,专业为地理信息科学,因跟老师一起做项目,所以有幸接触nc数据转换为tif数据,因为在这件事情上也遇过不少坑,也