Qt/C++开源控件 圆形进度条

news/2024/10/13 16:38:31

Qt/C++开源控件 圆形进度条

  • 简约风格: 设计简洁,没有多余的元素,清晰地显示了当前进度。
  • 颜色对比: 使用了亮色的蓝色来标示进度,与深色背景形成鲜明对比,使得进度指示一目了然。
  • 清晰的刻度: 刻度线清晰,尽管没有标注所有数字,但通过较长的刻度线在50和100的位置,用户可以很容易地估计进度。
  • 指针设计: 指针末端带有一个圆形装饰,这不仅美观而且提高了指针指向的清晰度。
  • 中心百分比显示: 进度的数值以大号字体在控件中心显示,用户可以快速读取数值信息。

#ifndef CIRCULARPROGRESS_H
#define CIRCULARPROGRESS_H#include <QWidget>
#include <QColor>class CircularProgress : public QWidget
{Q_OBJECTQ_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor)Q_PROPERTY(QColor scaleColor READ scaleColor WRITE setScaleColor)public:explicit CircularProgress(QWidget *parent = 0);~CircularProgress();int value() const;QColor backgroundColor() const;QColor scaleColor() const;public slots:void setValue(int newValue);void setBackgroundColor(const QColor &color);void setScaleColor(const QColor &color);signals:void valueChanged(int newValue);protected:void paintEvent(QPaintEvent *event) override;private:int m_value;QColor m_backgroundColor;QColor m_progressColor;QColor m_textColor;QColor m_scaleColor;void drawBackground(QPainter &painter);void drawProgress(QPainter &painter);void drawHandle(QPainter &painter, double angle);void drawScale(QPainter &painter);
};#endif // CIRCULARPROGRESS_H
#include "circularprogress.h"
#include <QPainter>
#include <QPainterPath>
#include <QtMath>CircularProgress::CircularProgress(QWidget *parent):QWidget(parent),m_value(0),m_backgroundColor(QColor(100, 100, 100)),//默认背景颜色为灰色m_progressColor(Qt::green),m_textColor(Qt::white),m_scaleColor(Qt::white)//默认刻度线颜色为白色
{
}CircularProgress::~CircularProgress()
{}int CircularProgress::value() const
{return m_value;
}QColor CircularProgress::backgroundColor() const
{return m_backgroundColor;
}QColor CircularProgress::scaleColor() const
{return m_scaleColor;
}void CircularProgress::setValue(int newValue)
{if (newValue < 0 || newValue > 100){return;}if (m_value != newValue){m_value = newValue;emit valueChanged(newValue);update();}
}void CircularProgress::setBackgroundColor(const QColor &color)
{if (m_backgroundColor != color){m_backgroundColor = color;update();}
}void CircularProgress::setScaleColor(const QColor &color)
{if (m_scaleColor != color){m_scaleColor = color;update();}
}void CircularProgress::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);drawBackground(painter);drawScale(painter);drawProgress(painter);drawHandle(painter, (m_value / 100.0) * 270.0);//根据进度计算角度
}void CircularProgress::drawBackground(QPainter &painter)
{painter.fillRect(rect(), m_backgroundColor);//绘制背景色
}void CircularProgress::drawProgress(QPainter &painter)
{int width = this->width() - 10;int height = this->height() - 10;int radius = qMin(width, height) / 2 - 30;//留出边距QRectF rectangle(width / 2 - radius, height / 2 - radius, 2 * radius, 2 * radius);painter.setPen(QPen(m_progressColor, 5));//从左下方开始顺时针到右下方结束,角度计算从(-135°)到(45°)int startAngle = -135 * 16;int spanAngle = -(m_value / 100.0) * 270 * 16;painter.drawArc(rectangle, startAngle, spanAngle);
}void CircularProgress::drawHandle(QPainter &painter, double angle)
{int width = this->width() - 10;int height = this->height() - 10;int radius = qMin(width, height) / 2 - 30;//留出边距int handleRadius = 5;//小圆点的半径//将角度从进度条的0%(225°)转换为顺时针角度double radian = qDegreesToRadians(-225 + angle);int centerX = width / 2 + (radius) * cos(radian);int centerY = height / 2 + (radius) * sin(radian);painter.setBrush(m_progressColor);painter.drawEllipse(QPointF(centerX, centerY), handleRadius, handleRadius);
}void CircularProgress::drawScale(QPainter &painter)
{int width = this->width() - 10;int height = this->height() - 10;int radius = qMin(width, height) / 2 - 45;//刻度位于进度条内painter.setPen(QPen(m_scaleColor, 2));for (int i = 0; i <= 100; i += 10){//从225°开始到-45°结束,确保顺时针方向double angle = -225 + (i / 100.0) * 270;double radian = qDegreesToRadians(angle);int outerX = width / 2 + radius * cos(radian);int outerY = height / 2 + radius * sin(radian);int innerX = width / 2 + (radius - 20) * cos(radian);//刻度线长度为10int innerY = height / 2 + (radius - 20) * sin(radian);painter.drawLine(QPointF(innerX, innerY), QPointF(outerX, outerY));//刻度文字QString text = QString::number(i);QFontMetrics fm(painter.font());int textX = width / 2 + (radius + 25) * cos(radian) - fm.width(text) / 2;int textY = height / 2 + (radius + 25) * sin(radian) - fm.height() / 3;painter.drawText(textX, textY, text);}//中心百分比文字painter.setPen(m_textColor);painter.setFont(QFont("Arial", 20, QFont::Bold));painter.drawText(rect(), Qt::AlignCenter, QString::number(m_value) + "%");
}

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

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

相关文章

GIC V3中断

GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器,其architecture specification目前有四个版本,V1~V4(V2最多支持8个ARM core,V3/V4支持更多的ARM core,主要用于ARM64服务器系统结构)。目前在ARM官方网站只能下载到Version 2的GIC architecture…

销售团队管理过程常见问题

一、招聘与选拔 在竞争激烈的市场环境中,寻找并选拔出既有能力又符合企业文化的销售人才是企业面临的首要挑战。优秀销售人才的稀缺性加剧了这一难题,而仅凭面试难以全面评估候选人的销售潜力和坚韧精神。因此,设计一套高效、多维度的招聘流程与评估标准显得尤为关键。这包括…

requests模块 - get

1、Requests 请求常用url:请求的 url 地址,接口文档标注的接口请求地址。 params:请求数据中的链接,常见的一个 get 请求,请求参数都是在 url 地址中。 data:请求数据,参数表单的数据格式。 json:接口常见的数据请求格式。 headers:请求头信息,http 请求中,比如说编…

Redis 必知概念

Redis 为什么快基于内存实现:Redis 将数据存储在内存中,读写操作不会受到磁盘 IO 速度限制; CPU 不是 Redis 的瓶颈,Redis 的瓶颈在于机器内存的大小或者网络带宽I/O多路复用模型的使用:Redis 线程不会阻塞在某一个特定的客户端请求处理上; 可以同时和多个客户端连接并处…

用sdkman管理多个jdk切换

前言 最近项目前后端进行升级,需要在jdk8和jdk17两个版本切换。最简单的是通过手动切换,但切换过程太繁琐,修改环境变量,达到切换目的。于是尝试其它解决方案,最终确实使用sdkman工具。sdkman 是一款面向Java开发者的命令行工具,旨在简化操作系统上SDKs的管理。支持跨平台…

20242822《Linux内核原理与分析》第三周作业

张晓攀+原创作品转载请注明出处+《Linux内核分析》MOOC课程https://mooc.study.163.com/course/1000029000 一、实验楼上实验二——mykernel实验指导(操作系统是如何工作的) 1.使用实验楼的虚拟机打开shell输入所给命令这段代码的意思是应用一个补丁文件到Linux内核源代码,配…

正义使者其五

最正义的一集\(\Huge{能参加高校校园行,好!}\)

2024-2025-1 20241407《计算机基础与程序设计》第三周学习总结

这个作业属于哪个课程 2024-2025-1计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第三周作业这个作业的目标 学习数字分类与计数法、位置计数法、进制转换、模拟数据与数字数据、压缩与解压、数字化、信息安全作业正文 https://www.cnblogs.com/wang…