from PySide6.QtWidgets import QFramefrom PySide6.QtCore import Signal, Property, Qtfrom PySide6.QtGui import QColor, QPainter, QPainterPathfrom ...common.style_sheet import isDarkThemefrom ...common.animation import BackgroundAnimationWidgetclass CardWidget(BackgroundAnimationWidget, QFrame): ''' card widget ''' # 创建一个点击信号 clicked = Signal() def __init__(self, parent=None): super().__init__(parent=parent) self._isClickEnabled = False self._borderRadius = 5 ... def getBorderRadius(self): return self._borderRadius def setBorderRadius(self, radius: int): self._borderRadius = radius self.update() def paintEvent(self, e): painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) w, h = self.width(), self.height() r = self.borderRadius d = 2*r isDark = isDarkTheme() # draw top border path = QPainterPath() path.arcMoveTo(1, h-d-1, d, d, 240) path.arcTo(1, h - d - 1, d, d, 225, -60) path.lineTo(1, r) path.arcTo(1, 1, d, d, -180, -90) path.lineTo(w - r, 1) path.arcTo(w - d - 1, 1, d, d, 90, -90) path.lineTo(w - 1, h - r) path.arcTo(w - d - 1, h - d - 1, d, d, 0, -60) topBorderColor = QColor(0, 0, 0, 20) if isDark: if self.isPressed: topBorderColor = QColor(255, 255, 255, 18) elif self.isHover: topBorderColor = QColor(255, 255, 255, 13) else: topBorderColor = QColor(0, 0, 0, 15) painter.strokePath(path, topBorderColor) # draw bottom border path = QPainterPath() path.arcMoveTo(1, h - d - 1, d, d, 240) path.arcTo(1, h - d - 1, d, d, 240, 30) path.lineTo(w - r - 1, h - 1) path.arcTo(w - d - 1, h - d - 1, d, d, 270, 30) bottomBorderColor = topBorderColor if not isDark and self.isHover and not self.isPressed: bottomBorderColor = QColor(0, 0, 0, 27) painter.strokePath(path, bottomBorderColor) # draw background painter.setPen(Qt.NoPen) rect = self.rect().adjusted(1, 1, -1, -1) painter.setBrush(self.backgroundColor) painter.drawRoundedRect(rect, r, r) borderRadius = Property(int, getBorderRadius, setBorderRadius)