原创声明:本文系作者授权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