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

}

相关推荐
木千8 小时前
Qt中关于eventFilter函数无法过滤QTableWidget鼠标事件的处理方式
qt
奇树谦15 小时前
【Qt实战】实现图片缩放、平移与像素级查看功能
开发语言·qt
010米粉01018 小时前
Qt Cmake之路(一):Cmake变量语法
开发语言·qt·cmake
颜*鸣&空18 小时前
Qt Creator快速搭建项目
开发语言·qt
道剑剑非道18 小时前
Qt【使用libmodbus库】
开发语言·数据库·qt
林政硕(Cohen0415)18 小时前
T113 Qt5.15.2 G2D 旋转
qt·t113·g2d
布茹 ei ai19 小时前
QtWeatherApp - 简单天气预报软件(C++ Qt6)(附源码)
开发语言·c++·qt·开源·开源项目·天气预报
奇树谦20 小时前
Qt QDockWidget 深度解析:从基础使用到可保存布局的工程级主界面
开发语言·qt
不会c嘎嘎21 小时前
初识QT -- 第一个QT程序
开发语言·qt