QTbattery

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

}

相关推荐
丰锋ff10 小时前
基于 Qt 的智能门禁系统(二)
开发语言·qt
进击ing小白14 小时前
Qt 无边框窗口进阶指南
开发语言·qt
问君能有几多愁~1 天前
Qt Json 序列化操作
开发语言·qt·json
平常心的技术小牛1 天前
Qt-快速上手-QFileDialog
windows·qt·microsoft
小小龙学IT1 天前
Qt Graphics View Framework(图形视图框架)深度解析:从 Scene/View/Item 到工业级 2D 场景
开发语言·数据库·qt
程与留1 天前
09_Qt 布局管理系统——QHBoxLayout、QVBoxLayout、QGridLayout
c++·qt
神仙别闹1 天前
基于QT(C++)实现旅游线路规划系统
c++·qt·旅游
≮傷£≯√1 天前
音量调节弹窗 自定义组件qt
开发语言·qt
小小龙学IT2 天前
Qt 6 跨平台开发完全指南:从信号槽机制到实际项目落地
开发语言·qt
丰锋ff2 天前
基于 Qt 的智能门禁系统
qt·学习