qt电池控件设计

其他推荐内容:

1 最终效果

在这里插入图片描述

2 电池控件代码设计

电池电量控件

  1. 可设置电池电量,动态切换电池电量变化
  2. 可设置电池电量警戒值
  3. 可设置电池电量正常颜色和报警颜色
  4. 可设置边框渐变颜色
  5. 可设置电量变化时每次移动的步长
  6. 可设置边框圆角角度/背景进度圆角角度/头部圆角角度

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

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值