Qt进阶-绘制一个电池

说明:
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);
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值