其他推荐内容:
- qt电池控件设计:https://blog.csdn.net/weixin_42887343/article/details/113932145
- QWidget控件拖动:https://blog.csdn.net/weixin_42887343/article/details/114384324
- QWidget控件旋转方法:https://blog.csdn.net/weixin_42887343/article/details/115037420
- qt柱状图控件设计:https://blog.csdn.net/weixin_42887343/article/details/115124178
- qt淡化提示框设计:https://blog.csdn.net/weixin_42887343/article/details/109303972
- qt之led(点阵)控件类设计:https://blog.csdn.net/weixin_42887343/article/details/115348953
电池控件设计
1 最终效果
2 电池控件代码设计
电池电量控件
- 可设置电池电量,动态切换电池电量变化
- 可设置电池电量警戒值
- 可设置电池电量正常颜色和报警颜色
- 可设置边框渐变颜色
- 可设置电量变化时每次移动的步长
- 可设置边框圆角角度/背景进度圆角角度/头部圆角角度
h文件(battery.h)
#ifndef BATTERY_H
#define BATTERY_H
#include <QWidget>
class Battery : public QWidget
{
Q_OBJECT
//Q_PROPERTY为自定义属性,可用于在ui文件中添加动态属性,方法:属性栏点击+号,选择其他,输入属性变量名字和对应的类型即可
Q_PROPERTY(qreal minValue READ getMinValue WRITE setMinValue)
Q_PROPERTY(qreal maxValue READ getMaxValue WRITE setMaxValue)
Q_PROPERTY(qreal value READ getValue WRITE setValue)
Q_PROPERTY(qreal alarmValue READ getAlarmValue WRITE setAlarmValue)
Q_PROPERTY(qreal step READ getStep WRITE setStep)
Q_PROPERTY(int borderRadius READ getBorderRadius WRITE setBorderRadius)
Q_PROPERTY(int bgRadius READ getBgRadius WRITE setBgRadius)
Q_PROPERTY(int headRadius READ getHeadRadius WRITE setHeadRadius)
Q_PROPERTY(QColor borderColorStart READ getBorderColorStart WRITE setBorderColorStart)
Q_PROPERTY(QColor borderColorEnd READ getBorderColorEnd WRITE setBorderColorEnd)
Q_PROPERTY(QColor alarmColorStart READ getAlarmColorStart WRITE setAlarmColorStart)
Q_PROPERTY(QColor alarmColorEnd READ getAlarmColorEnd WRITE setAlarmColorEnd)
Q_PROPERTY(QColor normalColorStart READ getNormalColorStart WRITE setNormalColorStart)
Q_PROPERTY(QColor normalColorEnd READ getNormalColorEnd WRITE setNormalColorEnd)
public:
explicit Battery(QWidget *parent = nullptr);
~Battery();
protected:
void paintEvent(QPaintEvent *);
void drawBorder(QPainter *painter);
void drawBg(QPainter *painter);
void drawHead(QPainter *painter);
private slots:
void updateValue();
private:
qreal minValue; //最小值
qreal maxValue; //最大值
qreal value; //目标电量
qreal alarmValue; //电池电量警戒值
qreal step; //每次移动的步长
int borderRadius; //边框圆角角度
int bgRadius; //背景进度圆角角度
int headRadius; //头部圆角角度
QColor borderColorStart; //边框渐变开始颜色
QColor borderColorEnd; //边框渐变结束颜色
QColor alarmColorStart; //电池低电量时的渐变开始颜色
QColor alarmColorEnd; //电池低电量时的渐变结束颜色
QColor normalColorStart; //电池正常电量时的渐变开始颜色
QColor normalColorEnd; //电池正常电量时的渐变结束颜色
bool isForward; //是否往前移
qreal currentValue; //当前电量
QRectF batteryRect; //电池主体区域
QTimer *timer; //绘制定时器
public:
qreal getMinValue() const;
qreal getMaxValue() const;
qreal getValue() const;
qreal getAlarmValue() const;
qreal getStep() const;
int getBorderRadius() const;
int getBgRadius() const;
int getHeadRadius() const;
QColor getBorderColorStart()const;
QColor getBorderColorEnd() const;
QColor getAlarmColorStart() const;
QColor getAlarmColorEnd() const;
QColor getNormalColorStart()const;
QColor getNormalColorEnd() const;
QSize sizeHint() const;
QSize minimumSizeHint() const;
public Q_SLOTS:
//设置范围值
void setRange(qreal minValue, qreal maxValue);
void setRange(int minValue, int maxValue);
//设置最大最小值
void setMinValue(qreal minValue);
void setMaxValue(qreal maxValue);
//设置电池电量值
void setValue(qreal value);
void setValue(int value);
//设置电池电量警戒值
void setAlarmValue(qreal alarmValue);
void setAlarmValue(int alarmValue);
//设置步长
void setStep(qreal step);
void setStep(int step);
//设置边框圆角角度
void setBorderRadius(int borderRadius);
//设置背景圆角角度
void setBgRadius(int bgRadius);
//设置头部圆角角度
void setHeadRadius(int headRadius);
//设置边框渐变颜色
void setBorderColorStart(const QColor &borderColorStart);
void setBorderColorEnd(const QColor &borderColorEnd);
//设置电池电量报警时的渐变颜色
void setAlarmColorStart(const QColor &alarmColorStart);
void setAlarmColorEnd(const QColor &alarmColorEnd);
//设置电池电量正常时的渐变颜色
void setNormalColorStart(const QColor &normalColorStart);
void setNormalColorEnd(const QColor &normalColorEnd);
Q_SIGNALS:
void valueChanged(qreal value);
};
#endif // BATTERY_H
cpp文件(battery.cpp)
#pragma execution_character_set("utf-8")
#include "battery.h"
#include "qpainter.h"
#include "qtimer.h"
#include "qdebug.h"
Battery::Battery(QWidget *parent) : QWidget(parent)
{
minValue = 0;
maxValue = 100;
value = 0;
alarmValue = 30;
step = 0.5;
borderRadius = 8;
bgRadius = 5;
headRadius = 3;
borderColorStart = QColor(100, 100, 100);
borderColorEnd = QColor(80, 80, 80);
alarmColorStart = QColor(250, 118, 113);
alarmColorEnd = QColor(204, 38, 38);
normalColorStart = QColor(50, 205, 51);
normalColorEnd = QColor(60, 179, 133);
isForward = false;
currentValue = 0;
timer = new QTimer(this);
timer->setInterval(10);
connect(timer, SIGNAL(timeout()), this, SLOT(updateValue()));
}
Battery::~Battery()
{
if (timer->isActive())
timer->stop();
}
void Battery::paintEvent(QPaintEvent *)
{
//绘制准备工作,启用反锯齿
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
//绘制边框
drawBorder(&painter);
//绘制背景
drawBg(&painter);
//绘制头部
drawHead(&painter);
}
void Battery::drawBorder(QPainter *painter)
{
painter->save();
qreal headWidth = width() / 10;
qreal batteryWidth = width() - headWidth;
//绘制电池边框
QPointF topLeft(5, 5);
QPointF bottomRight(batteryWidth, height() - 5);
batteryRect = QRectF(topLeft, bottomRight);
painter->setPen(QPen(borderColorStart, 5));
painter->setBrush(Qt::NoBrush);
painter->drawRoundedRect(batteryRect, borderRadius, borderRadius);
painter->restore();
}
void Battery::drawBg(QPainter *painter)
{
painter->save();
QLinearGradient batteryGradient(QPointF(0, 0), QPointF(0, height()));
if (currentValue <= alarmValue)
{
batteryGradient.setColorAt(0.0, alarmColorStart);
batteryGradient.setColorAt(1.0, alarmColorEnd);
}
else
{
batteryGradient.setColorAt(0.0, normalColorStart);
batteryGradient.setColorAt(1.0, normalColorEnd);
}
int margin = qMin(width(), height()) / 20;
qreal unit = (batteryRect.width() - (margin * 2)) / 100;
qreal width = currentValue * unit;
QPointF topLeft(batteryRect.topLeft().x() + margin, batteryRect.topLeft().y() + margin);
QPointF bottomRight(width + margin + 5, batteryRect.bottomRight().y() - margin);
QRectF rect(topLeft, bottomRight);
painter->setPen(Qt::NoPen);
painter->setBrush(batteryGradient);
painter->drawRoundedRect(rect, bgRadius, bgRadius);
painter->restore();
}
void Battery::drawHead(QPainter *painter)
{
painter->save();
QPointF headRectTopLeft(batteryRect.topRight().x(), height() / 3);
QPointF headRectBottomRight(width(), height() - height() / 3);
QRectF headRect(headRectTopLeft, headRectBottomRight);
QLinearGradient headRectGradient(headRect.topLeft(), headRect.bottomLeft());
headRectGradient.setColorAt(0.0, borderColorStart);
headRectGradient.setColorAt(1.0, borderColorEnd);
painter->setPen(Qt::NoPen);
painter->setBrush(headRectGradient);
painter->drawRoundedRect(headRect, headRadius, headRadius);
painter->restore();
}
void Battery::updateValue()
{
if (isForward)
{
currentValue -= step;
if (currentValue <= value)
timer->stop();
}
else
{
currentValue += step;
if (currentValue >= value)
timer->stop();
}
this->update();
}
qreal Battery::getMinValue() const
{
return this->minValue;
}
qreal Battery::getMaxValue() const
{
return this->maxValue;
}
qreal Battery::getValue() const
{
return this->value;
}
qreal Battery::getAlarmValue() const
{
return this->alarmValue;
}
qreal Battery::getStep() const
{
return this->step;
}
int Battery::getBorderRadius() const
{
return this->borderRadius;
}
int Battery::getBgRadius() const
{
return this->bgRadius;
}
int Battery::getHeadRadius() const
{
return this->headRadius;
}
QColor Battery::getBorderColorStart() const
{
return this->borderColorStart;
}
QColor Battery::getBorderColorEnd() const
{
return this->borderColorEnd;
}
QColor Battery::getAlarmColorStart() const
{
return this->alarmColorStart;
}
QColor Battery::getAlarmColorEnd() const
{
return this->alarmColorEnd;
}
QColor Battery::getNormalColorStart() const
{
return this->normalColorStart;
}
QColor Battery::getNormalColorEnd() const
{
return this->normalColorEnd;
}
QSize Battery::sizeHint() const
{
return QSize(150, 80);
}
QSize Battery::minimumSizeHint() const
{
return QSize(30, 10);
}
void Battery::setRange(qreal minValue, qreal maxValue)
{
//如果最小值大于或者等于最大值则不设置
if (minValue >= maxValue)
return;
this->minValue = minValue;
this->maxValue = maxValue;
//如果目标值不在范围值内,则重新设置目标值
//值小于最小值则取最小值,大于最大值则取最大值
if (value < minValue)
setValue(minValue);
else if (value > maxValue)
setValue(maxValue);
this->update();
}
void Battery::setRange(int minValue, int maxValue)
{
setRange((qreal)minValue, (qreal)maxValue);
}
void Battery::setMinValue(qreal minValue)
{
setRange(minValue, maxValue);
}
void Battery::setMaxValue(qreal maxValue)
{
setRange(minValue, maxValue);
}
void Battery::setValue(qreal value)
{
//值和当前值一致则无需处理
if (value == this->value)
return;
//值小于最小值则取最小值,大于最大值则取最大值
if (value < minValue)
value = minValue;
else if (value > maxValue)
value = maxValue;
if (value > currentValue)
isForward = false;
else if (value < currentValue)
isForward = true;
else
return;
this->value = value;
this->update();
emit valueChanged(value);
timer->start();
}
void Battery::setValue(int value)
{
setValue((qreal)value);
}
void Battery::setAlarmValue(qreal alarmValue)
{
if (this->alarmValue != alarmValue)
{
this->alarmValue = alarmValue;
this->update();
}
}
void Battery::setAlarmValue(int alarmValue)
{
setAlarmValue((qreal)alarmValue);
}
void Battery::setStep(qreal step)
{
if (this->step != step)
{
this->step = step;
this->update();
}
}
void Battery::setStep(int step)
{
setStep((qreal)step);
}
void Battery::setBorderRadius(int borderRadius)
{
if (this->borderRadius != borderRadius)
{
this->borderRadius = borderRadius;
this->update();
}
}
void Battery::setBgRadius(int bgRadius)
{
if (this->bgRadius != bgRadius)
{
this->bgRadius = bgRadius;
this->update();
}
}
void Battery::setHeadRadius(int headRadius)
{
if (this->headRadius != headRadius)
{
this->headRadius = headRadius;
this->update();
}
}
void Battery::setBorderColorStart(const QColor &borderColorStart)
{
if (this->borderColorStart != borderColorStart)
{
this->borderColorStart = borderColorStart;
this->update();
}
}
void Battery::setBorderColorEnd(const QColor &borderColorEnd)
{
if (this->borderColorEnd != borderColorEnd)
{
this->borderColorEnd = borderColorEnd;
this->update();
}
}
void Battery::setAlarmColorStart(const QColor &alarmColorStart)
{
if (this->alarmColorStart != alarmColorStart)
{
this->alarmColorStart = alarmColorStart;
this->update();
}
}
void Battery::setAlarmColorEnd(const QColor &alarmColorEnd)
{
if (this->alarmColorEnd != alarmColorEnd)
{
this->alarmColorEnd = alarmColorEnd;
this->update();
}
}
void Battery::setNormalColorStart(const QColor &normalColorStart)
{
if (this->normalColorStart != normalColorStart)
{
this->normalColorStart = normalColorStart;
this->update();
}
}
void Battery::setNormalColorEnd(const QColor &normalColorEnd)
{
if (this->normalColorEnd != normalColorEnd)
{
this->normalColorEnd = normalColorEnd;
this->update();
}
}
3 demo设计
创建最基本的mainwindows窗口,在窗口界面设计中,拖一个widget控件进主界面后提升该控件为Battery,再添加一个Slider控件,用于拉动可设置电池电量。
代码如下:
h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_horizontalSlider_valueChanged(int value);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->widget->setValue(ui->horizontalSlider->value());
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_horizontalSlider_valueChanged(int value)
{
ui->widget->setValue(value);
}