说明:
MyBattery类继承自QWidget,在界面添加一个widget控件,提升为MyBattery类,将滑动条的valueChanged事件与sls_setValue()槽绑定。
borderWidth = 5; //边框宽度
borderRadius = 5; //边框倒角
currentValue = 0; //当前电量
alarmValue = 30; //电池电量警戒值
bgRadius = 5; //背景电量倒角
alarmColorStart = QColor(250, 118, 113);//低电量时的渐变开始颜色
alarmColorEnd = QColor(204, 38, 38); //低电量时的渐变结束颜色
normalColorStart = QColor(50, 205, 51); //正常电量时的渐变开始颜色
normalColorEnd = QColor(60, 179, 133); //正常电量时的渐变结束颜色
//电量改变
void MyBattery::sls_setValue(int value)
{
currentValue = value;
update();
}
void MyBattery::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); //反锯齿
//绘制电池边框
QPointF topLeft(5, 5); //边框矩形
QPointF bottomRight(14 * width() / 15.0, height() - 5);
QRectF batteryRect = QRectF(topLeft, bottomRight);
QColor borderColor = QColor(100, 100, 100); //边框颜色及线宽
painter.setPen(QPen(borderColor, borderWidth));
painter.setBrush(Qt::NoBrush);
painter.drawRoundedRect(batteryRect, borderRadius, borderRadius);
//绘制电池头部
QPointF headTopLeft(batteryRect.topRight().x(), height() / 3); //头部矩形
QPointF headBottomRight(width(), 2 * height() / 3);
QRectF headRect(headTopLeft, headBottomRight);
painter.setBrush(borderColor);
painter.drawRoundedRect(headRect, borderRadius, borderRadius);
//绘制电池电量
QLinearGradient batteryGradient(QPointF(0, 0), QPointF(0, height()));
if (currentValue <= alarmValue) //低电量颜色
{
batteryGradient.setColorAt(0.0, alarmColorStart);
batteryGradient.setColorAt(1.0, alarmColorEnd);
}
else //正常电量颜色
{
batteryGradient.setColorAt(0.0, normalColorStart);
batteryGradient.setColorAt(1.0, normalColorEnd);
}
int margin = qMin(width(), height()) / 20; //电量内边距
double unit = (batteryRect.width() - (margin * 2)) / 100; //1个电量的长度
double width = currentValue * unit;
QPointF chargeTopLeft(batteryRect.topLeft().x() + margin, batteryRect.topLeft().y() + margin);
QPointF chargeBottomRight(width + margin + borderWidth, batteryRect.bottomRight().y() - margin);
QRectF chargeRect(chargeTopLeft, chargeBottomRight);
painter.setPen(Qt::NoPen);
painter.setBrush(batteryGradient);
painter.drawRoundedRect(chargeRect, bgRadius, bgRadius);
}