Qt自定义控件之Battery电池控件

news2024/11/15 23:42:28

文章目录

  • 前言
  • 一、BasicBattery
  • 二、Battery控件
  • 三、效果
  • 总结


前言

在Qt应用程序开发中,自定义控件是一种常见的需求,开发者经常需要根据特定的需求创建定制化的控件来增强用户界面的交互性和美观性。Battery电池控件是一种常见的自定义控件,用于显示设备的电池状态。通过Battery控件,用户可以直观地了解设备电量情况,提高用户体验和操作便利性。


一、BasicBattery

为什么需要BasicBattery
我们是C++面向对象,所以我们可以写一个基类给Battery,如果我们以后想要其他样式的电池,我们直接继承,去写电池的样式即可,不用去写设置电池电量这些内容,节约时间:

BasicBattery.h代码:

#ifndef BASICBATTERY_H
#define BASICBATTERY_H

#include <QWidget>
#include <QColor>

class BasicBattery : public QWidget
{
    Q_OBJECT
public:
    // 枚举类型定义了电池状态
    enum BatteryStatus
    {
        Discharging, // 放电状态
        Charging,    // 充电状态
        Full         // 充满状态
    };

    // 构造函数,创建一个基础电池对象
    explicit BasicBattery(QWidget *parent = nullptr);

    // 设置电量百分比
    void setLevel(int level);
    // 获取电量百分比
    int level() const;

    // 设置电池状态
    void setStatus(BatteryStatus status);
    // 获取电池状态
    BatteryStatus status() const;

    // 设置电池边框颜色
    void setBorderColor(const QColor &color);
    // 获取电池边框颜色
    QColor borderColor() const;

    // 设置电池内部填充颜色
    void setPaddingColor(const QColor &color);
    // 获取电池内部填充颜色
    QColor paddingColor() const;

    // 设置充电指示器颜色
    void setChargeColor(const QColor &color);
    // 获取充电指示器颜色
    QColor chargeColor() const;

    // 设置低电量警告颜色
    void setLowBatteryColor(const QColor &color);
    // 获取低电量警告颜色
    QColor lowBatteryColor() const;

    // 设置绘制偏移量
    void setOffset(const QPoint &offset);
    // 获取绘制偏移量
    QPoint offset() const;

    // 设置电池外形是否为圆角
    void setRound(bool round);

    // 获取电池外形是否为圆角
    bool isRound() const;

    // 设置圆角占电池高度的百分比
    void setRoundPresent(int roundPresent);

    // 获取圆角占电池高度的百分比
    int roundPresent() const;

signals:

private:
    // 获取控件尺寸
    void getSize();

protected:
    virtual void paintEvent(QPaintEvent *event);
    virtual void resizeEvent(QResizeEvent *event);

    // 成员变量,保存电池的宽度、高度、电量百分比、状态以及颜色等信息
    int m_width;          // 电池宽度
    int m_height;         // 电池高度
    int m_level = 5;          // 电量百分比
    bool m_round = true; // 标志变量,表示电池外形是否为圆角
    int m_roundPresent = 5; // 圆角占电池高度的百分比,用于控制圆角的大小
    BatteryStatus m_status = Discharging;  // 电池状态
    QColor m_border = Qt::white;       // 电池边框颜色
    QColor m_padding = Qt::white;      // 电池内部填充颜色
    QColor m_charge = Qt::green;       // 充电指示器颜色
    QColor m_nobattery = Qt::red;    // 低电量警告颜色
    QPoint m_offset = QPoint(2,2);       // 绘制偏移量,用于绘制电量指示器位置
};

#endif // BASICBATTERY_H

BasicBattery.cpp代码:

#include "BasicBattery.h"

BasicBattery::BasicBattery(QWidget *parent)
    : QWidget{parent}
{
    getSize();
}

void BasicBattery::getSize()
{
    this->m_width = width();
    this->m_height = height();
}

void BasicBattery::paintEvent(QPaintEvent *event)
{

}

void BasicBattery::resizeEvent(QResizeEvent *event)
{
    getSize();
    update();
}

// 设置电量百分比
void BasicBattery::setLevel(int level) {
    m_level = level;
    this->update();
}

// 获取电量百分比
int BasicBattery::level() const {
    return m_level;
}

// 设置电池状态
void BasicBattery::setStatus(BatteryStatus status) {
    m_status = status;
    this->update();
}

// 获取电池状态
BasicBattery::BatteryStatus BasicBattery::status() const {
    return m_status;
}

// 设置电池边框颜色
void BasicBattery::setBorderColor(const QColor &color) {
    m_border = color;
    this->update();
}

// 获取电池边框颜色
QColor BasicBattery::borderColor() const {
    return m_border;
}

// 设置电池内部填充颜色
void BasicBattery::setPaddingColor(const QColor &color) {
    m_padding = color;
    this->update();
}

// 获取电池内部填充颜色
QColor BasicBattery::paddingColor() const {
    return m_padding;
}

// 设置充电指示器颜色
void BasicBattery::setChargeColor(const QColor &color) {
    m_charge = color;
    this->update();
}

// 获取充电指示器颜色
QColor BasicBattery::chargeColor() const {
    return m_charge;
}

// 设置低电量警告颜色
void BasicBattery::setLowBatteryColor(const QColor &color) {
    m_nobattery = color;
    this->update();
}

// 获取低电量警告颜色
QColor BasicBattery::lowBatteryColor() const {
    return m_nobattery;
}

// 设置绘制偏移量
void BasicBattery::setOffset(const QPoint &offset) {
    m_offset = offset;
    this->update();
}

// 获取绘制偏移量
QPoint BasicBattery::offset() const {
    return m_offset;
}

void BasicBattery::setRound(bool round)
{
    m_round = round;
    this->update();
}

bool BasicBattery::isRound() const
{
    return m_round;
}

void BasicBattery::setRoundPresent(int roundPresent)
{
    m_roundPresent = roundPresent;
    this->update();
}

int BasicBattery::roundPresent() const
{
    return m_roundPresent;
}

二、Battery控件

我们直接继承BasicBattery类,去实现paintEvent画出他的样子即可实现最终效果:
Battery.h代码:

#ifndef BATTERY_H
#define BATTERY_H

#include "BasicBattery.h"
#include <QWidget>
#include <QPainter>

class Battery : public BasicBattery
{
    Q_OBJECT
public:
    explicit Battery(QWidget *parent = nullptr);

signals:

protected:
    void paintEvent(QPaintEvent *event);

private:
    // 绘制电池边框
    void drawBorder(QPainter *painter);
    // 绘制电池填充
    void drawFill(QPainter *painter);
};

#endif // BATTERY_H

Battery.cpp核心代码:

void Battery::drawBorder(QPainter *painter)
{
    // 保存当前画笔状态
    painter->save();

    // 设置画笔颜色和样式
    painter->setPen(this->m_border);

    // 绘制电池外壳,采用圆角矩形
    painter->drawRoundedRect(0, 0, m_width * 0.93, this->m_height, this->m_roundPresent, this->m_roundPresent);

    // 计算并绘制电池右侧的正极
    int poleWidth = 5; // 正极宽度
    int poleHeight = m_height * 0.3; // 正极高度
    int poleX = m_width * 0.93 + m_offset.x(); // 正极横坐标,位于电池右侧边框处并考虑间隔
    int poleY = (m_height - poleHeight) / 2; // 正极纵坐标,使其垂直居中

    // 设置正极颜色与边框颜色一致,并绘制正极
    painter->setBrush(this->m_border);
    painter->drawRect(poleX, poleY, poleWidth, poleHeight);

    // 恢复之前保存的画笔状态
    painter->restore();
}

void Battery::drawFill(QPainter *painter)
{
    painter->save();

    // 计算电池内部填充区域的宽度
    qreal fillWidth = (m_width * 0.93 - 2 * m_offset.x()) * m_level / 100;
    // 计算电池内部填充区域的高度
    qreal fillHeight = m_height - 2 * m_offset.y();

    qDebug() << fillWidth;

    // 计算电池内部填充区域的起始点
    qreal fillX = m_offset.x();
    qreal fillY = m_offset.y();

    // 根据电池状态设置填充颜色
    QColor fillColor = m_padding;
    if (m_status == Charging) {
        fillColor = m_charge;
    } else if (m_level <= 20) {
        fillColor = m_nobattery;
    }

    // 设置填充颜色
    painter->setBrush(fillColor);

    // 绘制填充区域
    painter->drawRoundedRect(QRectF(fillX, fillY, fillWidth, fillHeight), this->m_roundPresent, this->m_roundPresent);

    painter->restore();
}

三、效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


总结

Battery电池控件作为Qt自定义控件的一种,为开发者提供了一种简单而有效的方法来集成电池状态显示功能到他们的应用程序中。通过Battery控件,开发者可以轻松地展示设备的电量信息,为用户提供更好的使用体验。定制化的Battery控件不仅可以满足用户对电池状态的实时监控需求,还能够使应用程序更具吸引力和个性化,为用户带来更加愉悦的用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1568415.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Codeforces Round 932 (Div. 2) ---- F. Andrey‘s Tree ---- 题解

F. Andreys Tree&#xff1a; 题目描述&#xff1a; 思路解析&#xff1a; 我们假设删除任意一个结点后&#xff0c;我们会将整个树切分为k个联通块&#xff0c;那么可以明确的知道我们只需要连接(k-1)条边就可以将这k个联通块重新连为一棵树。 那么最小代价是啥呢? 图解分…

代码随想录day35--动态规划的应用2||01背包理论基础、携带研究材料

01背包理论基础 有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i],得到的价值为 value[i]。每件物品只能用一次&#xff0c;将这些物品装入背包里物品价值总和最大。 这是很标准的背包问题&#xff0c;很多同学看到后很自然的就想到了背包&#xff0c;我们…

ruoyi-nbcio-plus基于vue3的flowable流程设计器主界面升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

链路追踪原理

分布式系统为什么需要链路追踪&#xff1f; 随着互联网业务快速扩展&#xff0c;软件架构也日益变得复杂&#xff0c;为了适应海量用户高并发请求&#xff0c;系统中越来越多的组件开始走向分布式化&#xff0c;如单体架构拆分为微服务、服务内缓存变为分布式缓存、服务组件通…

前视声呐目标识别定位(六)-代码解析之目标截图并传输

前视声呐目标识别定位&#xff08;一&#xff09;-基础知识 前视声呐目标识别定位&#xff08;二&#xff09;-目标识别定位模块 前视声呐目标识别定位&#xff08;三&#xff09;-部署至机器人 前视声呐目标识别定位&#xff08;四&#xff09;-代码解析之启动识别模块 …

leetcode刷题-代码训练营-第7章-回溯算法1

回溯法模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&#xff0c;撤销处理结果} }理解 从…

红蓝色WordPress外贸建站模板

红蓝色WordPress外贸建站模板 https://www.mymoban.com/wordpress/5.html

爬虫部署平台crawlab使用说明

Crawlab 是一个基于 Go 语言的分布式网络爬虫管理平台&#xff0c;它支持 Python、Node.js、Jar、EXE 等多种类型的爬虫。 Crawlab 提供了一个可视化的界面&#xff0c;并且可以通过简单的配置来管理和监控爬虫程序。 以下是 Crawlab 的一些主要优点&#xff1a; 集中管理&am…

DFS:深搜+回溯+剪枝解决组合问题

创作不易&#xff0c;感谢支持!!! 一、电话号码的组合 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string hash[10]{"","","abc","def","ghi","jkl","mno","pqrs"…

2024年 前端JavaScript 进阶 第3天 笔记

3.1-JS进阶-内容和两种编程思想 3.2-构造函数实现封装以及存在 3.3-原型对象prototype 3.4-数组扩展案例-求最大值和数组求和 3.5-constructor属性以及应用 3.6-对象原型proto 3.7-原型继承 3.8-原型链以及instanceof运算符 3.9-综合案例-模态框构造函数写法 3.10-综合案例-0pe…

vtk,ITK,DICOM3.0

(14 封私信 / 80 条消息) VTK ITK OPENCV&#xff0c;从图像处理的角度来说&#xff0c;哪种用的人多&#xff1f; - 知乎 (zhihu.com) 医学领域&#xff1a;通常要求使用ITK和VTK。 ITK做底层处理算法。 VTK做可视化显示。 ITK:Insight Segment and Regestration Toolkit …

Redis的5大常见数据类型的用法

上一篇文章我们讲了Redis的10大应用场景&#xff0c;这一篇文章就针对Redis的常用数据结构进行一个说明&#xff0c;通过示例的形式演示每一种数据结构如何使用。 当涉及Redis的数据操作时&#xff0c;不同数据类型对应的不同数据结构&#xff0c;如下就对5大常用的数据类型进行…

我与C++的爱恋:内联函数,auto

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 ​ 一、内联函数 1.内联函数的概念 内联函数目的是减少函数调用的开销&#xff0c;通过将每个调用点将函数展开来实现。这种方法仅适用于那些函数体小、调用频繁的函数。 …

Fusion360修改嘉立创EDA专业版生成的3D外壳文件

需要第三方软件的原因 嘉立创EDA专业版生成电路板的3D外壳文件是比较快捷的&#xff0c;但如果侧面精密开孔或者添加其它非常规的元素还是有些局限。嘉立创EDA专业版可以把3D外壳文件导出&#xff0c;这就大大方便了第三方软件的修改。 本文是利用Fusion360修改3D外壳文件&…

C++ | string类学习 | string的常见接口使用方式

目录 为什么要学习string类&#xff1f; C语言中的字符串 OOP面向对象编程 两个面试题 标准库中的string类 string类了解 string类的文档介绍 总结 string类的常用接口说明 string类对象的常见构造 string类对象的容量操作 size()和length() clear() resize(size…

【C语言】【Leetcode】2437. 有效时间的数目

文章目录 题目思路一、枚举思路二、回溯 题目 链接: link 思路一、枚举 这题的可以简单的看成 h1 h2 : m1 m2 的情况&#xff0c;其中 h1 和 h2 有关&#xff0c; m1 和 m2 有关&#xff0c;数目不多可以直接暴力枚举解决 int countTime(char * time) {int countHour 0;i…

SQLite下一代查询规划器(十)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite 查询优化器概述&#xff08;九&#xff09; 下一篇&#xff1a;SQLite的架构&#xff08;十一&#xff09; 1. 引言 “查询规划器”的任务是弄清楚 找出完成 SQL 语句的最佳算法或“查询计划”。 从 SQLi…

Markdown介绍

一.Markdown基本介绍&#x1f357; Markdown 是一种轻量级标记语言&#xff0c;用于简单、易读易写的文本格式编写。它设计初衷是让人们能够使用普通文本编辑器编写格式简单的文档&#xff0c;并且可以转换成有效的HTML。Markdown 的语法非常简洁直观&#xff0c;通过使用特定…

BIT-5-动态内存管理(C语言进阶)

本章重点 为什么存在动态内存分配动态内存函数的介绍 mallocfreecallocrealloc常见的动态内存错误几个经典的笔试题柔性数组 1. 为什么存在动态内存分配 我们已经掌握的内存开辟方式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟…

好物视频素材在哪找?视频素材大全app下载

创作优质视频内容不仅仅是一种艺术&#xff0c;也是一种科学&#xff0c;需要对素材的深刻理解和精心挑选。掌握了这些高清无水印视频素材&#xff0c;您就拥有了创作引人入胜视频内容的强大工具。以下是更多精选的视频素材网站&#xff0c;旨在为您的视频项目提供更广阔的视野…