Pyside | PYQT无边框设计,窗口移动和调整大小的简单写法

原创声明:本文系作者授权CSDN平台发表,未经许可,不得转载。



🌹代码已上传到 gitee 仓库,文章浏览完毕后方可获取仓库地址🌹

💖前言

提示:如有错误或更好的建议请在评论区指出或私信

如果把系统自带边框去掉后,窗口移动和调整大小以及最大化、最小化等功能就消失了。网上有很多无边框设计的模板,但是大多都是通过各种计算来判断位置以及各种计算来改变窗口大小和移动窗口,代码量很长而且略复杂。所以本次对无边框设计做个优化,来简化代码量和代码逻辑。


一、去掉系统边框、背景透明

  • 去掉系统边框的函数为setWindowFlags()
    • 参数需需要填全,否则一些功能丢失,比如点击任务栏无法最小化等
      (Qt.Window | Qt.FramelessWindowHint | Qt.WindowSystemMenuHint | Qt.WindowMinimizeButtonHint| Qt.WindowMaximizeButtonHint)
  • 窗口透明函数setAttribute(Qt.WA_TranslucentBackground)

代码如下(示例):

class CustomWindow(QMainWindow):
	def __init__(self):
		super().__init__()
		self.set_window()  # 定制窗口
		
    def set_window(self):
       # 关闭系统标题栏
       self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint | Qt.WindowSystemMenuHint | Qt.WindowMinimizeButtonHint
                           | Qt.WindowMaximizeButtonHint)
       # 透明背景
       self.setAttribute(Qt.WA_TranslucentBackground)

二、边框添加阴影

因为背景透明,如若不添加阴影那么定位窗口边缘时无法定位(透明的,相当于窗口没有这一部分了)

代码如下(示例):

class CustomWindow(QMainWindow):
	def __init__(self):
		super().__init__()
		
		# 边界以透明,设置边框阴影效果,否则无法定位边界
		self.shadow = QGraphicsDropShadowEffect(self)
		self.shadow.setBlurRadius(15)
		self.shadow.setColor(QColor(0, 0, 0, 150))
		self.shadow.setOffset(0, 0)
		self.setGraphicsEffect(self.shadow)

三、窗口调整大小

窗口调整大小主要用到QT的鼠标事件功能,结合窗口调整大小内置函数来实现;
窗口需要开启鼠标跟踪self.setMouseTracking(True)
备注:控件的父类也开启跟踪,否则只有在按下鼠标左键的时候才跟踪

1. 窗口边缘改变鼠标样式

  • 利用鼠标移动事件来判断
  • 利用QRect来圈定窗口边界范围,QRect的参数为(左上角x, 左上角y, 右下角x, 右下角y);
  • event.pos()返回当前鼠标位置;
  • 检查鼠标是否在这个矩形范围QRect.contains(event.pos()) 返回bool值;

所以当鼠标在矩形范围内返回True时,更改鼠标的 调整大小的样式,并且给类定义一个方向属性,返回当前所在哪个矩形范围内。

代码如下(示例):

# 窗口边缘设置鼠标手势(右侧、底部、右下角)
    def mouseMoveEvent(self, event):

        # QRect边界范围(左上角x, 左上角y, 右下角x, 右下角y)
        # 右侧边缘(窗口宽度减去边框宽度,0, 窗口宽度, 窗口高度)
        self.right_edge = QRect(self.width() - 10, 0, self.width(), self.height())
        # 底部边缘(不在具体说明)
        self.bottom_edge = QRect(0, self.height() - 10, self.width() - 25, self.height())
        # 右下角边缘(不在具体说明)
        self.right_bottom_edge = QRect(self.width() - 25, self.height() - 10, self.width(), self
  • 21
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值