66 lines
2.6 KiB
Python
66 lines
2.6 KiB
Python
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()) |