Qt基于QWidget实现倒计时控件CircleCountDownBar

news/2025/2/19 13:05:17/文章来源:https://www.cnblogs.com/pandamohist/p/18716258

目标

  • 基于Qwidget实现圆弧倒计时
  • 可自定义圆弧内部显示的文字
  • 可设定当前圆弧的进度

效果图

完整控件代码

CircleCountDownBar.h

#pragma once#include <QWidget>
class QPaiter;
class QPaintEvent;class CircleCountDownBar : public QWidget
{Q_OBJECTpublic:CircleCountDownBar(QWidget* parent = nullptr);~CircleCountDownBar();/// /// @brief:		设置最大值与最小值/// @param: 	const qreal minValue - 最小值/// @param: 	const qreal maxValue - 最大值///  @ret:		void///				/// void setRange(const qreal minValue, const qreal maxValue);/// 设置当前值void setCurValue(qreal cur_value);/// 设置要绘制的文字void setText(const QString& cur_text);/// 绘制文字颜色void setTextColor(const QColor& text_color);private:void paintEvent(QPaintEvent* event);//void draw
private:/// 大圆背景色QColor	m_bigCircleColor = QColor(230, 230, 230);/// 扇形有效的颜色QColor m_curPieValidColor = QColor("#2AEBA2");/// 圆环无效的颜色QColor m_pieInvalidColor = QColor(200, 200, 200); /// 中间填充小圆形的颜色QColor m_smallCircleColor = QColor(64, 64, 66);/// 当前显示文本QString m_curText{};/// 当前文本显示颜色QColor m_curTextColor = QColor(230, 230, 230);/// 角度的最大值qreal m_maxValue = 100;/// 角度的最小值qreal m_minValue = 0;/// 起始角度, 0度 位于 X正半轴。倒数为正qreal		m_startAngle = 90;/// 当前值qreal		m_curValue = 270;
};

CircleCountDownBar.cpp


#include "CircleCountDownBar.h"
#include <QPainter>CircleCountDownBar::CircleCountDownBar(QWidget *parent): QWidget(parent)
{setWindowFlags(Qt::FramelessWindowHint);setAttribute(Qt::WA_TranslucentBackground);
}CircleCountDownBar::~CircleCountDownBar()
{
}/// 
/// @brief: CircleCountDownBar::setRange
/// 
void CircleCountDownBar::setRange(const qreal minValue, const qreal maxValue)
{m_maxValue = (0 >= maxValue ? 1 : maxValue);m_minValue = (0 >= minValue ? 0 : minValue);
}/// 
/// @brief: 设置当前值
/// 
void CircleCountDownBar::setCurValue(qreal cur_value)
{if (cur_value <= m_minValue){cur_value = m_minValue;}else if (cur_value >= m_maxValue){cur_value = m_maxValue;}else{}if (true == qFuzzyCompare(0.0, m_maxValue)){m_maxValue = 1.0;}m_curValue = ((m_maxValue - cur_value) * 360.0 / (m_maxValue));update();
}/// 
/// @brief: 设置要绘制的文字
/// 
void CircleCountDownBar::setText(const QString& cur_text)
{m_curText = cur_text;update();
}/// 
/// @brief: CircleCountDownBar::setTextColor
/// 
void CircleCountDownBar::setTextColor(const QColor& text_color)
{m_curTextColor = text_color;update();
}/// 
/// @brief: 
/// 
void CircleCountDownBar::paintEvent(QPaintEvent* event)
{int width = this->width();int height = this->height();int side = qMin(width, height);//绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放QPainter painter(this);QRect new_rect = this->rect();painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing, true);painter.translate(width / 2, height / 2);painter.scale(side / 200.0, side / 200.0);/// 背景色painter.fillRect(new_rect, QColor(0,0,0,0));{int radius = 100;painter.save();/// 绘制灰色背景painter.setPen(Qt::NoPen);painter.setBrush(m_curPieValidColor);painter.drawEllipse(-radius, -radius, radius * 2, radius * 2);painter.restore();}/// 小圆形{int radius = 80;painter.save();painter.setPen(Qt::NoPen);painter.setBrush(m_bigCircleColor);painter.drawEllipse(-radius, -radius, radius * 2, radius * 2);painter.restore();}/// 绘制扇形颜色{int radius = 100;painter.save();painter.setPen(Qt::NoPen);painter.setBrush(m_pieInvalidColor);int startAngle = m_startAngle * 16;int spanAngle = m_curValue * 16;painter.drawPie(-radius, -radius, radius*2, radius*2, startAngle, spanAngle);painter.restore();}/// 绘制遮盖白色圆形{int radius = 80;painter.save();painter.setPen(Qt::NoPen);painter.setBrush(m_smallCircleColor);painter.drawEllipse(-radius, -radius, radius * 2, radius * 2);painter.restore();}/// 绘制文字{int radius = 80;painter.save();painter.setPen(m_curTextColor);painter.setBrush(Qt::NoBrush);QFont font = painter.font();font.setPixelSize(20);painter.setFont(font);QRectF textRect(-radius, -radius, radius * 2, radius * 2);painter.drawText(textRect, Qt::AlignCenter, m_curText);painter.restore();}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初学者的量化 “利器”,哪种策略才是你的菜?

初学者量化投资别迷茫!中低频策略为何优选?快来解锁适合拟的量化“利器”策略更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 写在前面 这篇文章专为量化投资领域的小白精心打造,量化大神们请自动略过哦。 本文将从中低频交易方…

Qt实现速度仪表盘GaugeSpeedWidget

目标基于QWidget绘制速度仪表盘, 仪表盘颜色为渐变色, 可指定当前显示的文字内容和文字颜色 可指定当前指针旋转的数值效果图控件完整代码 GaugeSpeedWidget.h #pragma once#include <QWidget> #include <QMap>class QPaintEvent; class QPainter;/// /// @brie…

pcie报文

PCIE的四种请求memory、IO的地址编码posted、no-postedTLP包类型缩写MRD举例TLP包格式TLP HEADTLP HEAD byte0memory操作

P1107 [BJWC2008] 雷涛的小猫

链接 https://www.luogu.com.cn/problem/P1107 题目思路因为在取h+delta的max时会一直遍历,所以直接加个记忆,就不用一直遍历了。 代码 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<queue> #include<cmath> #in…

PVE8.3.1开启核显虚拟化SR-IOV

本来想集成到前面的文章,但是被网上一些文章误导从而浪费了3H之后决定还是单开一篇专门说说PVE8.3.1开启核显虚拟化的过程。所以建议大家还是参考更有价值的唯一的官方指南 https://github.com/strongtz/i915-sriov-dkms 交代一下背景: 发文日期2025年2月14日,以下所有操作均…

【C】单链表

单链表 声明一个指向自身的结构体 struct Test {int x;int y;struct Test test; };输出结果: error!程序报错,因为这样会造成无限的循环。当编译器解析到struct Test test时test是结构体Test的成员,定义test成员需要Test,而结构体Test自身又是不完整的,那么程序就无法定义一…

所有Ollama用户请注意!!!你的IP可能已泄露

刚刚学到一项非常硬核的“黑”科技,只要几个关键词,就能实现 Ollama 自由。全世界几万台高性能带显卡的电脑供你使用。 添加图片注释,不超过 140 字(可选)看看这个页面,美国,中国,德国,英国....一个独立 IP 背后就是一台电脑,有些可能还是服务器。我实测了,随便找一…

【C】内存布局

动态内存管理 动态内存管理的几个函数malloc -- 申请动态内存空间 free -- 释放动态内存空间 calloc -- 申请并初始化一系列内存空间 realloc -- 重新分配内存空间malloc函数原型:void *malloc(size_t size);malloc函数向系统申请分配size个字节的内存空间,并返回一个指向这块…

【C】指针

指针 变量在内存中的存放 在内存中,字节是最小的存储单元。对于一个内存单元来说,指针就是单元的地址,每个地址可以存放一个字节的数据。存放一个整形变量(int)就需要动用到四个存储单元。 在内存中完全没有存储变量名的必要。 因为编译器知道具体每一个变量名对应的存放地址…

VMwareWorkstation pro 17下载与安装

‌VMware Workstation Pro 17‌是一款功能强大的虚拟机软件,专为开发者和IT专业人士设计。它允许用户在一台物理计算机上创建和运行多个虚拟操作系统,从而实现跨平台的开发、测试和部署。VMware Workstation Pro 17采用了先进的虚拟化技术,能够在单个物理主机上运行多个虚拟…

我的“ DeepSeek 越来越闲了”!讯飞星火无限调用 API 攻略来了

最近DeepSeek 确实挺忙,网页繁忙,API资源紧张。 添加图片注释,不超过 140 字(可选) 开源模型也很忙,被下载了 267万次!!! 添加图片注释,不超过 140 字(可选) 但是,我的 DeepSeek 要越来越闲了。腾讯云的接口刚用上,讯飞星火的又来了。 添加图片注释,不超过 1…

【C】数组

数组 数组的定义语法:类型 数组名[元素个数] (方括号内只能是常量或者常量表达式) int a[6]; char b[24]; double c[3];上面几个类型分别占用内存的字节数为: int a[6] ==> 4 * 6 = 24 char b[24] ==> 1 * 24 = 24 double c[3] …