当绘制了一个窗体后代码里设置为无边框时,缺少阴影的问题随之出现。边框阴影最大的作用即使得应用窗口的窗体边界变得清晰。
默认窗体的阴影如下图所示

有边框示例.png

但是代码里设置为无边框后就变得很难区分窗体

self.setWindowFlags(Qt.FramelessWindowHint)

无边框无阴影.png

折腾了许久,最终得到一个比较满意的效果

无边框有阴影.png

一开始虽然阴影绘制出来,但是时不时遇到UpdateLayeredWindowIndirect failed,并且界面操作还会出现奇怪的BUG,最后对这块进行了整理,我把渲染的层次整理出来如图所示,按这个层次绘制就不存在问题。

阴影层实现示例.png

示例代码:

class frame_shadow_test(QFrame, Ui_Frame):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        # 设置窗口=.setWindowFlags无边框
        self.setWindowFlags(Qt.FramelessWindowHint)
        # 将界面属性设置为透明
        self.setAttribute(Qt.WA_TranslucentBackground, True)  

        # 设定一个阴影,半径=10,颜色为#444444,定位为(0,0)
        self.shadow_frame.shadow = QGraphicsDropShadowEffect()
        self.shadow_frame.shadow.setBlurRadius(10)
        self.shadow_frame.shadow.setColor(QColor("#444444"))
        self.shadow_frame.shadow.setOffset(0, 0)
        # 把阴影层作用到里层的主窗体
        self.frame.setGraphicsEffect(self.shadow_frame.shadow)