Files
Feeding_control_system/view/widgets/circular_button.py
2025-11-01 16:13:30 +08:00

66 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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())