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

}

相关推荐
锦亦之22339 小时前
QT+OSG+OSG-earth如何在窗口显示一个地球
开发语言·qt
柳鲲鹏13 小时前
编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MinGW版)
开发语言·qt·mysql
三玖诶13 小时前
如何在 Qt 的 QListWidget 中逐行添加和显示数据
开发语言·qt
阳光开朗_大男孩儿19 小时前
DBUS属性原理
linux·服务器·前端·数据库·qt
Alphapeople20 小时前
Qt Modbus
开发语言·qt
竹林海中敲代码20 小时前
Qt Creator 集成开发环境 常见问题
qt·qt工具常见问题
竹林海中敲代码1 天前
Qt安卓开发连接手机调试(红米K60为例)
android·qt·智能手机
长沙红胖子Qt1 天前
关于 Qt运行加载内存较大崩溃添加扩大运行内存 的解决方法
开发语言·qt·qt扩大运行内存
gopher95111 天前
qt相关面试题
开发语言·qt·面试
三玖诶1 天前
在 Qt 中使用 QLabel 设置 GIF 动态背景
开发语言·qt·命令模式