from PySide6.QtWidgets import QPushButton from PySide6.QtGui import QPainter, QFont, Qt, QPixmap, QColor from PySide6.QtCore import QRectF import resources.resources_rc from utils.image_paths import ImagePaths # 用于 开、拱 等功能按钮 class CircularButton(QPushButton): """自定义圆形按钮""" def __init__(self, text, parent=None): super().__init__(text, parent) # 设置按钮大小为41x41(与图片尺寸一致) self.setFixedSize(41, 41) # 加载背景图片 self.normal_pixmap = QPixmap(ImagePaths.ROUND_BTN_BG1) # 正常状态图片 需要修改为实际的路径 self.hover_pixmap = QPixmap(ImagePaths.ROUND_BTN_BG2) # hover状态图片 需要修改为实际的路径 # 确保图片加载成功(可选:添加错误处理) if self.normal_pixmap.isNull(): print("警告:圆形按钮背景1.png 加载失败") if self.hover_pixmap.isNull(): print("警告:圆形按钮背景2.png 加载失败") # 字体初始化状态和颜色 self.is_hover = False self.normal_text_color = QColor(6, 224, 239) self.hover_text_color = QColor(3, 20, 100) # 设置按钮手势 self.setCursor(Qt.PointingHandCursor) # 去除默认样式 self.setStyleSheet("background: transparent; border: none;") def enterEvent(self, event): self.is_hover = True self.update() # 触发重绘 super().enterEvent(event) def leaveEvent(self, event): self.is_hover = False self.update() # 触发重绘 super().leaveEvent(event) def paintEvent(self, event): painter = QPainter(self) painter.setRenderHint(QPainter.RenderHint.Antialiasing) # 抗锯齿 # 绘制对应状态的背景图片 current_pixmap = self.hover_pixmap if self.is_hover else self.normal_pixmap if not current_pixmap.isNull(): # 绘制图片并适应按钮大小(保持圆形) painter.drawPixmap(self.rect(), current_pixmap) # 绘制文字 # painter.setPen(self.hover_text_color if self.is_hover else self.normal_text_color) # print("self.is_hover: ", self.is_hover) if self.is_hover: # 根据鼠标是否解除修改字体颜色 painter.setPen(self.hover_text_color) else: painter.setPen( self.normal_text_color) painter.setFont(QFont("Arial", 12, QFont.Weight.Bold)) # 在按钮中心绘制文字 painter.drawText(self.rect(), Qt.AlignmentFlag.AlignCenter, self.text())