#include "hbattery.h"
hBattery::hBattery(QWidget *parent) : QWidget(parent)
{
m_CurrentValue = 20;
m_Margin = 1;
m_BatteryMAXValue = 100;
m_BatteryMinValue = 0;
m_BatteryWidth = 50;
m_BatteryHeight = 25;
m_IsRecharge = false;
m_BorderPen = QPen(Qt::gray, 2);
m_TextPen = QPen(Qt::white);
m_LightingPen = QPen(Qt::yellow, 2);
m_TextFont = QFont("Arial", 11);
p_RechargeTimer = new QTimer;
connect(p_RechargeTimer, &QTimer::timeout, this, &hBattery::fRechargeRun);
}
/** *******************************************************************
* @Function : paintEvent
* @Parameter : QPaintEvent
* @Return : 无
* @Author : hx
* @Description : 重写绘制事件
* @Date : 2024-10-25 14:24:44
******************************************************************* **/
void hBattery::paintEvent(QPaintEvent * event)
{
Q_UNUSED(event);
//绘制准备工作,启用反锯齿
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
//1.绘制边框和头部
fDrawBorder(&painter);
//2.绘制填充
fDrawBackground(&painter);
//3.内部百分比
fDrawText(&painter);
//4.是否充电
if(m_IsRecharge)
fDrawLightning(&painter);
}
/** *******************************************************************
* @Function : fDrawBorder
* @Parameter : QPainter 画笔
* @Return : 无
* @Author : hx
* @Description : 绘制电池边宽
* @Date : 2024-10-25 14:24:44
******************************************************************* **/
void hBattery::fDrawBorder(QPainter *painter)
{
//保存状态
painter->save();
//设置笔的颜色和粗细
painter->setPen(m_BorderPen);
//没有画刷填充
painter->setBrush(Qt::NoBrush);
//绘制给定的圆角矩形 矩形 xRadius yRadius
//painter->drawRoundedRect(batteryRect, borderRadius, borderRadius);
//电池边框居中
m_BatteryRect = QRectF((width() - m_BatteryWidth)/2, (height() - m_BatteryHeight)/2, m_BatteryWidth, m_BatteryHeight);
painter->drawRoundedRect(m_BatteryRect, 3, 3);
//电池头部:画一条直线
painter->setPen(QPen(Qt::gray, 5));
QLineF line(m_BatteryRect.topRight().x() + 3, m_BatteryRect.topRight().y() + 8, m_BatteryRect.topRight().x() + 3, m_BatteryRect.bottomRight().y() - 8);
painter->drawLine(line);
//恢复状态
painter->restore();
}
/** *******************************************************************
* @Function : fDrawBackground
* @Parameter : QPainter 画笔
* @Return : 无
* @Author : hx
* @Description : 绘制电池电量背景
* @Date : 2024-10-25 14:24:44
******************************************************************* **/
void hBattery::fDrawBackground(QPainter *painter)
{
int tempBattery;
if(!m_IsRecharge)
tempBattery = m_CurrentValue;
else
tempBattery = m_RechargeValue;
//保存状态
painter->save();
//确定画刷颜色
if(tempBattery <= 10)
//红
painter->setBrush(QColor(204, 38, 38));
else if (tempBattery <= 30)
//黄
painter->setBrush(QColor(198, 163, 0));
else
//绿
painter->setBrush(QColor(50, 205, 51));
//当前电量转化为宽
double width = tempBattery * (m_BatteryRect.width() - (m_Margin * 2)) / 100;
//确定左上角位置
QPointF topLeft(m_BatteryRect.topLeft().x() + m_Margin, m_BatteryRect.topLeft().y() + m_Margin);
//确定变化的右下角, 最小给个10, 显示内部的填充
QPointF bottomRight(m_BatteryRect.topLeft().x() + width + m_Margin, m_BatteryRect.bottomRight().y() - m_Margin);
QRectF rect(topLeft, bottomRight);
//没有线宽
painter->setPen(Qt::NoPen);
painter->drawRoundedRect(rect, 5, 5);
//恢复状态
painter->restore();
}
/** *******************************************************************
* @Function : fDrawText
* @Parameter : QPainter 画笔描述
* @Return : 无
* @Author : hx
* @Description : 绘制文字
* @Date : 2024-10-25 14:24:44
******************************************************************* **/
void hBattery::fDrawText(QPainter *painter)
{
//保存状态
painter->save();
painter->setPen(m_TextPen);
painter->setFont(m_TextFont);
QString value;
if(!m_IsRecharge)
value = QString::number(m_CurrentValue) + "%";
else
value = QString::number(m_RechargeValue) + "%";
//文本居中的好方法
if(m_IsRecharge)
painter->drawText(m_BatteryRect, Qt::AlignLeft | Qt::AlignVCenter, value);
else
painter->drawText(m_BatteryRect, Qt::AlignHCenter | Qt::AlignVCenter, value);
//恢复状态
painter->restore();
}
/** *******************************************************************
* @Function : fDrawLightning
* @Parameter : QPainter 画笔
* @Return : 无
* @Author : hx
* @Description : 绘制充电符号
* @Date : 2024-10-25 14:24:44
******************************************************************* **/
void hBattery::fDrawLightning(QPainter *painter)
{
// 保存状态
painter->save();
// 设置闪电的颜色5
painter->setPen(m_LightingPen); // 更细的线条
// 计算文本的中心位置
QPointF textCenter = m_BatteryRect.center();
// 计算闪电的起始点(在文本右侧)
QPointF startPoint(textCenter.x() + 15, textCenter.y() - 8); // 向右偏移
// 绘制闪电,只拐两下
QPolygon lightning;
lightning << QPoint(startPoint.x(), startPoint.y()) //起点
<< QPoint(startPoint.x() - 5, startPoint.y() + 8) // 向左下
<< QPoint(startPoint.x() + 5, startPoint.y() + 8) // 向右下
<< QPoint(startPoint.x() - 5, startPoint.y() + 16) // 向左下
<< QPoint(startPoint.x(), startPoint.y() + 8); // 终点
painter->drawPolygon(lightning);
// 恢复状态
painter->restore();
}
/** *******************************************************************
* @Function : fSetBatteryValue
* @Parameter : batteryValue 电量
* @Return : 无
* @Author : hx
* @Description : 设置当前电池电量
* @Date : 2024-10-25 16:58:17
******************************************************************* **/
void hBattery::fSetBatteryValue(int batteryValue)
{
m_CurrentValue = batteryValue;
this->update();
}
/** *******************************************************************
* @Function : fSetBatteryStatus
* @Parameter : isRecharge 是否充电
* @Return : 无
* @Author : hx态
* @Description : 设置电池充放电状态
* @Date : 2024-10-25 16:59:25
******************************************************************* **/
void hBattery::fSetBatteryStatus(bool isRecharge)
{
m_IsRecharge = isRecharge;
m_RechargeValue = m_CurrentValue;
if(m_IsRecharge)
p_RechargeTimer->start(100);
else
{
p_RechargeTimer->stop();
this->update();
}
}
/** *******************************************************************
* @Function : fSetColorstyle
* @Parameter : borderPen 边框样式
* textPen 文字样式
* lightingPen 充电符号样式
* @Return : 无
* @Author : hx
* @Description : 设置电池样式
* @Date : 2024-10-25 17:00:26
******************************************************************* **/
void hBattery::fSetColorstyle(const QPen &borderPen, const QPen &textPen, const QPen &lightingPen)
{
m_BorderPen = borderPen;
m_TextPen = textPen;
m_LightingPen = lightingPen;
this->update();
}
/** ******************
没有合适的资源?快使用搜索试试~ 我知道了~
Qt自定义battery控件代码
共3个文件
h:1个
pri:1个
cpp:1个
需积分: 0 0 下载量 129 浏览量
2024-10-30
10:34:10
上传
评论
收藏 3KB ZIP 举报
温馨提示
支持电量颜色(红/黄/绿)变化,电量百分比显示,充/放电模式
资源推荐
资源详情
资源评论
收起资源包目录
hBattery.zip (3个子文件)
hBattery.pri 71B
hbattery.cpp 10KB
hbattery.h 1KB
共 3 条
- 1
资源评论
三分糖丶去冰
- 粉丝: 34
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功