一般显示的窗口都会有明显的边界或者阴影,比如说chrome也有一个淡淡的阴影。
窗口添加阴影的好处有很多,比如说让用户能够明显的区分各个窗口,也可以让界面看起来更加的美观和直接。
接下来就说说pyqt里面是如何添加这个窗口阴影的。
QtWidgets.QGraphicsDropShadowEffect
# 添加阴影
self.effect_shadow = QtWidgets.QGraphicsDropShadowEffect(self)
self.effect_shadow.setOffset(0,0) # 偏移
self.effect_shadow.setBlurRadius(10) # 阴影半径
self.effect_shadow.setColor(QtCore.Qt.gray) # 阴影颜色
self.main_widget.setGraphicsEffect(self.effect_shadow) # 将设置套用到widget窗口中
上面这段代码就是给窗口添加阴影使用的
可以给出一个窗口的demo,看下具体在代码中是如何使用的
我们随便创建一个pyqt的窗口demo
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
class WindowDemo(QtWidgets.QMainWindow):
def __init__(self):
super(WindowDemo,self).__init__()
self.setup_ui()
self.add_shadow()
def setup_ui(self):
self.setFixedSize(300,400)
self.main_widget = QtWidgets.QWidget()
def add_shadow(self):
# 添加阴影
self.effect_shadow = QtWidgets.QGraphicsDropShadowEffect(self)
self.effect_shadow.setOffset(0,0) # 偏移
self.effect_shadow.setBlurRadius(10) # 阴影半径
self.effect_shadow.setColor(QtCore.Qt.gray) # 阴影颜色
self.main_widget.setGraphicsEffect(self.effect_shadow) # 将设置套用到widget窗口中
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
MainWindow = WindowDemo()
MainWindow.show()
sys.exit(app.exec_())
这个就是一段demo。
使用了self.add_shadow()
具体可能不明显,这是因为有边框线的存在,所以导致添加阴影使用的场景并不广泛。
实际使用中,有人可能为了美化去掉了原来pyqt自带的边框,又设置了窗口背景透明,比如在主窗口界面使用了这段代码。
self.setWindowOpacity(0.93) # 设置窗口透明度
self.setAttribute(QtCore.Qt.WA_TranslucentBackground) # 设置窗口背景透明
self.setWindowFlag(QtCore.Qt.FramelessWindowHint)# 隐藏边框
这种场景才是添加这个阴影的使用场景,不想用边框线,又想让窗口看起来区别其他窗口。
但是直接使用这个阴影的函数,它不生效。。。
这是因为去除边框又背景透明的同时,窗口实际大小也就变小了,阴影函数也同时失效。
有一种解决办法,就是在主窗口的外面再套上一个透明窗口,对内层窗口使用这个阴影函数就可以。
比如这样。
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
class WindowDemo(QtWidgets.QMainWindow):
def __init__(self):
super(WindowDemo,self).__init__()
self.setup_ui()
self.add_shadow()
def setup_ui(self):
self.setWindowOpacity(0.93) # 设置窗口透明度
self.setAttribute(QtCore.Qt.WA_TranslucentBackground) # 设置窗口背景透明
self.setWindowFlag(QtCore.Qt.FramelessWindowHint)# 隐藏边框
self.setFixedSize(300,400)
self.base_widget = QtWidgets.QWidget() # 创建透明窗口
self.base_widget.setStyleSheet('''QWidget{ border-radius:7px;background-color:rgb(255, 255, 255);}''')
self.base_widget.setObjectName('base_widget')
self.base_layout = QtWidgets.QGridLayout()
self.base_widget.setLayout(self.base_layout)
self.base_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground)
self.main_widget = QtWidgets.QWidget()
self.main_widget.setStyleSheet('''QWidget{border-radius:7px;background-color:rgb(255,255,255);}''')
self.base_layout.addWidget(self.main_widget)
self.setCentralWidget(self.base_widget) # 设置窗口主部件
def add_shadow(self):
# 添加阴影
self.effect_shadow = QtWidgets.QGraphicsDropShadowEffect(self)
self.effect_shadow.setOffset(0,0) # 偏移
self.effect_shadow.setBlurRadius(10) # 阴影半径
self.effect_shadow.setColor(QtCore.Qt.gray) # 阴影颜色
self.main_widget.setGraphicsEffect(self.effect_shadow) # 将设置套用到widget窗口中
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
MainWindow = WindowDemo()
MainWindow.show()
sys.exit(app.exec_())
运行之后就可以看出添加阴影和不添加阴影的区别
下面这个是有阴影的
下面这个是没有阴影的。
这个就是阴影使用的一个方法吧。
不过阴影的大小可能受到最外层窗口和内层窗口距离的影响,这个调整下内外层窗口的间距就可以了。