QTbattery

#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();
}
 

你可能感兴趣的:(QT,qt)