sample_code/soc_pkg/代码分离/battery_gui.py
2025-04-01 08:52:50 +08:00

90 lines
3.5 KiB
Python

from PyQt5.QtWidgets import QWidget, QVBoxLayout
from PyQt5.QtGui import QPainter, QColor, QBrush, QFont
from PyQt5.QtCore import Qt
class BatteryWidget(QWidget):
def __init__(self, total_voltage=24.4):
super().__init__()
self.total_voltage = total_voltage
self.soc = self.get_soc_from_total_voltage(self.total_voltage)
def paintEvent(self, event):
painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing) # 开启抗锯齿
# 绘制电池轮廓
width, height = 80, 40 # 电池图标的宽度和高度
x, y = (self.width() - width) // 2, 20 # 图标垂直居中
painter.setPen(Qt.black) # 设置边框颜色为黑色
painter.setBrush(QColor(200, 200, 200)) # 设置背景颜色为灰色
painter.drawRoundedRect(x, y, width, height, 3, 3) # 绘制圆角矩形
# 绘制电池正极
painter.setBrush(QColor(0, 0, 0)) # 设置正极颜色为黑色
painter.drawRect(x + width, y + height // 4, width // 10, height // 2)
# 根据电量百分比填充电池
fill_height = int(height * 0.8) # 留出上下边距
fill_width = int((width - 4) * (self.soc / 100)) # 根据 SoC 缩放填充宽度
fill_color = self.get_battery_color(self.soc) # 获取电量对应的颜色
painter.setBrush(QBrush(QColor(*fill_color)))
painter.drawRect(x + 2, y + (height - fill_height) // 2, fill_width, fill_height)
# 绘制百分比文字
font = QFont("Arial", 14) # 设置字体大小
painter.setFont(font)
text = f"{self.soc:.1f}%" # 百分比格式化为一位小数
text_width = painter.fontMetrics().width(text) # 获取文字宽度
text_height = painter.fontMetrics().height() # 获取文字高度
painter.setPen(Qt.black) # 设置文字颜色为黑色
painter.drawText(
(self.width() - text_width) // 2, # 水平居中
y + height + text_height + 5, # 放置在电池图标下方
text
)
def get_soc_from_total_voltage(self, total_voltage):
"""
调用外部逻辑计算电量百分比
"""
from battery_logic import get_soc_from_total_voltage
return get_soc_from_total_voltage(total_voltage)
def get_battery_color(self, soc):
"""
调用外部逻辑获取电池颜色
"""
from battery_logic import get_battery_color
return get_battery_color(soc)
def update_voltage(self, total_voltage):
# 更新电池电压并重新绘制
self.total_voltage = total_voltage
self.soc = self.get_soc_from_total_voltage(self.total_voltage)
self.update() # 触发重新绘制
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.battery_voltage = 24.4 # 默认初始电压
self.init_ui()
def init_ui(self):
self.setWindowTitle("电池状态") # 设置窗口标题
self.setFixedSize(300, 120) # 设置固定窗口大小
# 创建电池组件
self.battery_widget = BatteryWidget(total_voltage=self.battery_voltage)
layout = QVBoxLayout()
layout.addWidget(self.battery_widget)
self.setLayout(layout)
def update_battery_voltage(self, total_voltage):
"""
公共接口:更新电池电压
:param total_voltage: 新的总电压值
"""
self.battery_widget.update_voltage(total_voltage)