前言
最近在使用PySide6开发一样东西的时候,需要实现一个带有内阴影的异形组件,但找了很多资料文档,都没有多好的解决方案;就连万能的AI
也没能给我很好的答案,最终自己瞎捣鼓了一个方案,自认为效果还不错,特此分享。
吐槽: 没想到在前端仅需一个
box-shadow
即可实现的效果在PySide6
中竟然如此难实现,直至今日,官方竟也没有一个多好的解决方案(难度QT
没有这样的需求,还是PySide6
没有,当然也可能是我不知道)
小声BB:QGraphicsDropShadowEffect
也并不好用,还只能实现外阴影,效果也不强大
这就是前端的设计图,需用PySide6
实现,最终效果虽稍有偏差,但还算说得过去。
其对应的box-shadow
为inset 3px 3px 6px 0px rgba(255, 255, 255, 0.7),inset -3px -3px 6px 0px rgba(0, 0, 0, 0.3);
,为黑白两层内阴影构成。
第一步
首先需绘制一个目标图形,由于是异形,非寻常图形,所以需自己重写paintEvent
,大致代码如下
class CustomFrame(QFrame):
def __init__(self, parent: QWidget = None):
super().__init__(parent)
def paintEvent(self, event):
painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing, True)
size = self.size()
path = self.getPath(size.width(), size.height())
painter.setPen(QColor(41, 177, 150))
painter.setBrush(QColor(41, 177, 150))
painter.drawPath(path)
painter.setBrush(QBrush())
def getPath(self, width: int, height: int) -> QPainterPath:
"""获取异形路径"""