QT编写电池程序

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPainter>
#include <QTimer>

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值