#include "mybattery.h"
#include <QPainter>
#include <QDebug>
MyBattery::MyBattery(QWidget *parent) : QWidget(parent)
{
initBettery();
}
MyBattery::~MyBattery()
{
}
void MyBattery::initBettery()
{
m_curValue = 0;
m_tarValue = 0;
m_isValueAdd = true;
m_valueChangeTimer = new QTimer(this);
m_valueChangeTimer->setInterval(10);
connect(m_valueChangeTimer, SIGNAL(timeout()), this, SLOT(slotTimerOut()));
}
void MyBattery::paintEvent(QPaintEvent *event)
{
// 启用反锯齿
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
// 绘制电池边框
drawBetteryBorder(&painter);
// 绘制电池头部
drawBetteryHead(&painter);
// 绘制电池电量
drawBetteryLevel(&painter);
QWidget::paintEvent(event);
}
void MyBattery::drawBetteryBorder(QPainter *painter)
{
painter->save();
double headLength = width() / 20; // 电池头的长度
double borderLength = width() - headLength; // 电池框的长度
// 绘制电池框
int borderWidth = 5; // 电池框的边框宽度
int borderRadius = 6; // 电池框的圆角弧度
QPointF topLeft(borderWidth, borderWidth);
QPointF bottomRight(borderLength, height() - borderWidth);
m_batteryRect = QRectF(topLeft, bottomRight);
painter->setPen(QPen(QColor(255, 255, 255), borderWidth));
painter->setBrush(Qt::NoBrush);
painter->drawRoundedRect(m_batteryRect, borderRadius, borderRadius);
painter->restore();
}
void MyBattery::drawBetteryHead(QPainter *painter)
{
painter->save();
QPointF headRectTopLeft(m_batteryRect.topRight().x(), height() / 3);
QPointF headRectBottomRight(width(), height() - height() / 3);
QRectF headRect(headRectTopLeft, headRectBottomRight);
int headRadius = 3; // 电池头部圆角弧度
painter->setPen(Qt::NoPen);
painter->setBrush(QColor(255,255,255));
painter->drawRoundedRect(headRect, headRadius, headRadius);
painter->restore();
}
void MyBattery::drawBetteryLevel(QPainter *painter)
{
painter->save();
int borderWidth = 5; // 电池框的边框宽度
int levelRadius = 5; // 电量圆角弧度
double unit = (m_batteryRect.width() - (borderWidth * 2)) / 100;
double width = m_curValue * unit;
QPointF topLeft(m_batteryRect.topLeft().x() + borderWidth, m_batteryRect.topLeft().y() + borderWidth);
QPointF bottomRight(width + borderWidth + borderWidth, m_batteryRect.bottomRight().y() - borderWidth);
QRectF levelRect(topLeft, bottomRight);
QLinearGradient batteryGradient(levelRect.topLeft(), levelRect.bottomLeft());
if (m_curValue <= 30) {
batteryGradient.setColorAt(0.0, QColor(250, 128, 114));
batteryGradient.setColorAt(1.0, QColor(205, 92, 92));
} else {
batteryGradient.setColorAt(0.0, QColor(50, 205, 50));
batteryGradient.setColorAt(1.0, QColor(60, 179, 113));
}
painter->setPen(Qt::NoPen);
painter->setBrush(batteryGradient);
painter->drawRoundedRect(levelRect, levelRadius, levelRadius);
painter->restore();
}
void MyBattery::slotUpdateLevel(int value)
{
updateLevel((double)value);
}
void MyBattery::updateLevel(double value)
{
// 值和当前值一致则无需处理
if (value == m_curValue) {
return;
}
// 值不在0-100的重置一下value的值
if(value < 0)
{
value = 0;
}
if(value > 100)
{
value = 100;
}
// 计算电量是增加还是减少
if (value > m_curValue)
{
m_isValueAdd = true;
}
else if(value < m_curValue)
{
m_isValueAdd = false;
}
m_tarValue = value;
if(m_valueChangeTimer->isActive())
{
m_valueChangeTimer->stop();
}
m_valueChangeTimer->start();
}
void MyBattery::slotTimerOut()
{
double step = 0.5; // 每次变化的值
if (m_isValueAdd)
{
m_curValue += step;
if (m_curValue >= m_tarValue)
{
m_curValue = m_tarValue;
m_valueChangeTimer->stop();
}
}
else
{
m_curValue -= step;
if (m_curValue <= m_tarValue)
{
m_curValue = m_tarValue;
m_valueChangeTimer->stop();
}
}
update();
}
没有合适的资源?快使用搜索试试~ 我知道了~
Qt绘制电池进度条(paintEvent)
共8个文件
cpp:3个
h:2个
pro:1个
需积分: 5 4 下载量 31 浏览量
2024-03-22
13:21:53
上传
评论
收藏 7KB ZIP 举报
温馨提示
做了一个电池的进度条,加了警示色和正常色的判断,还加了一些动画效果,分享一下,适合初学者,开发环境是Qt5.14.2+MSVC2017。
资源推荐
资源详情
资源评论
收起资源包目录
MyBattery.zip (8个子文件)
MyBattery
widget.ui 1KB
mybattery.h 940B
widget.cpp 316B
MyBattery.pro.user 22KB
mybattery.cpp 4KB
main.cpp 175B
MyBattery.pro 1KB
widget.h 304B
共 8 条
- 1
资源评论
Q泥T挖
- 粉丝: 32
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功