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

}

相关推荐
Larry_Yanan13 分钟前
QML学习笔记(四十三)QML与C++交互:上下文属性暴露
c++·笔记·qt·学习·ui·交互
江公望5 小时前
Qt的QT_QPA_EGLFS_INTEGRATION环境变量浅解
linux·qt·qml
精英的英6 小时前
【工具开发】适用于交叉编译环境的QT qmake项目转换vscode项目插件
人工智能·vscode·qt·开源软件
Source.Liu6 小时前
【BuildFlow & 筑流】品牌命名与项目定位说明
c++·qt·rust·markdown·librecad
unicrom_深圳市由你创科技7 小时前
工业上位机,用Python+Qt还是C#+WPF?
python·qt·c#
Larry_Yanan17 小时前
QML学习笔记(四十二)QML的MessageDialog
c++·笔记·qt·学习·ui
Main. 2421 小时前
从0到1学习Qt -- 创建项目
qt
共享家95271 天前
QT-常用控件(多元素控件)
开发语言·前端·qt
寻找华年的锦瑟1 天前
Qt-键鼠事件
开发语言·qt
jjjxxxhhh1231 天前
【项目-】Qt + QCustomPlot 实现频谱监测仪:四图联动、高频信号注入、鼠标交互全解析
开发语言·qt·交互