#ifndef WIDGET_H
#define WIDGET_H
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
QRectF batteryRect;
QTimer *inputTimer;
double _currentValue;
int _margin;
double _minValue;
double _maxValue;
bool _isForward;
int _batteryWidth;
int _batteryHeight;
protected:
void paintEvent(QPaintEvent *);
void drawBorder(QPainter *painter);
void drawBackground(QPainter *painter);
void drawText(QPainter *painter);
private slots:
void inputValue();
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
,_currentValue(10)
,_margin(3)
,_minValue(0)
,_maxValue(100)
,_isForward(true)
,_batteryWidth(50)
,_batteryHeight(20)
, ui(new Ui::Widget)
{
ui->setupUi(this);
setFixedSize(350,180);
setBaseSize(400,180);
inputTimer = new QTimer(this);
inputTimer->setInterval(100);
connect(inputTimer,&QTimer::timeout,this,&Widget::inputValue);
inputTimer->start();
}
Widget::~Widget()
{
if(inputTimer->isActive())
{
inputTimer->stop();
}
delete ui;
}
void Widget::inputValue()
{
if(_isForward)
_currentValue+=1;
else
_currentValue-=1;
if(_currentValue>=_maxValue)
{
_currentValue=_maxValue;
_isForward=false;
}
if(_currentValue<=_minValue)
{
_currentValue=_minValue;
_isForward=true;
}
update();
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing);
drawBorder(&painter);
drawBackground(&painter);
drawText(&painter);
}
void Widget::drawBorder(QPainter *painter)
{
painter->save();
painter->setPen(QPen(Qt::gray,5));
painter->setBrush(Qt::NoBrush);
batteryRect=QRectF((width()-_batteryWidth)/2,(height()-_batteryHeight)/2,_batteryWidth,_batteryHeight);
painter->drawRoundedRect(batteryRect,2,2);
painter->setPen(QPen(Qt::gray,5));
QLineF line(batteryRect.topRight().x()+5,batteryRect.topRight().y()+5,batteryRect.topRight().x()+5,batteryRect.bottomRight().y()-5);
painter->drawLine(line);
painter->restore();
}
void Widget::drawBackground(QPainter *painter)
{
painter->save();
if(_currentValue<=10)
painter->setBrush(QColor(204,38,38));
if(_currentValue<=20)
painter->setBrush(QColor(190,163,0));
else
painter->setBrush(QColor(50,205,51));
double width = _currentValue*(batteryRect.width()-(_margin*2))/100;
QPointF topleft(batteryRect.topLeft().x()+_margin,batteryRect.topLeft().y()+_margin);
QPointF bottomRight(batteryRect.topLeft().x()+_margin+width,batteryRect.bottomRight().y()-_margin);
QRectF rect(topleft,bottomRight);
painter->setPen(Qt::NoPen);
painter->drawRoundRect(rect,5,5);
painter->restore();
}
void Widget::drawText(QPainter *painter)
{
painter->save();
painter->setPen(Qt::black);
painter->setFont(QFont("Arial",11));
QString value=QString::number(_currentValue)+"%";
painter->drawText(batteryRect,Qt::AlignCenter,value);
painter->restore();
}