#include <QtWidgets>
#include "cloudgauge.h"
CloudGauge::CloudGauge(QWidget *parent) :
QWidget(parent)
{
bgColor = QColor("#191e24");
baseColor = QColor("#3e424c");
arcColor = QColor("#282d35");
borderColor = QColor("#22a2a8");
textColor = QColor("#ffffff");
enterColor = QColor("#22a2a8");
pressColor = QColor("#22a2a8");
iconText = "0x25BC";
centerText = "0x27F3";
cloudStyle = CloudStyle_Black;
}
CloudGauge::~CloudGauge()
{
}
QColor CloudGauge::getBgColor() const
{
return bgColor;
}
QColor CloudGauge::getBaseColor() const
{
return baseColor;
}
QColor CloudGauge::getArcColor() const
{
return arcColor;
}
QColor CloudGauge::getBorderColor() const
{
return borderColor;
}
QColor CloudGauge::getTextColor() const
{
return textColor;
}
QColor CloudGauge::getEnterColor() const
{
return enterColor;
}
QColor CloudGauge::getPressColor() const
{
return pressColor;
}
QString CloudGauge::getIconText() const
{
return iconText;
}
QString CloudGauge::getCenterText() const
{
return centerText;
}
CloudGauge::CloudStyle CloudGauge::getCloudStyle() const
{
return cloudStyle;
}
bool CloudGauge::getAutoRepeat() const
{
return autoRepeat;
}
int CloudGauge::getAutoRepeatDelay() const
{
return autoRepeatDelay;
}
int CloudGauge::getAutoRepeatInterval() const
{
return autoRepeatInterval;
}
double CloudGauge::twoPtDistance(const QPointF &pt1, const QPointF &pt2)
{
double tx = pt2.x()-pt1.x();
double ty = pt2.y()-pt1.y();
return qSqrt(tx*tx+ty*ty);
}
void CloudGauge::mousePressEvent(QMouseEvent *e)
{
lastPoint = e->pos();
repaint();
}
void CloudGauge::mouseReleaseEvent(QMouseEvent *e)
{
lastPoint = e->pos();
repaint();
}
void CloudGauge::mouseMoveEvent(QMouseEvent *e)
{
qDebug() << "mouseMoveEvent";
}
void CloudGauge::paintEvent(QPaintEvent */*e*/)
{
int width = this->width();
int height = this->height();
int side = qMin(width, height);
//以中心点为基准,分别计算八方位区域和中间区域
QPointF center = this->rect().center();
double centerSize = (double)side / ((double)100 / 30);
double iconSize = (double)side / ((double)100 / 10);
double offset1 = 3.6;
double offset2 = 2.65;
//计算当前按下点到中心点的距离,如果小于内圆的半径则认为在内圆中
double offset = twoPtDistance(lastPoint, this->rect().center());
inCenter = (offset <= centerSize / 2);
//中间区域
centerRect = QRectF(center.x() - centerSize / 2, center.y() - centerSize / 2, centerSize, centerSize);
//左侧图标区域
leftRect = QRectF(center.x() - iconSize * offset1, center.y() - iconSize / 2, iconSize, iconSize);
//上侧图标区域
topRect = QRectF(center.x() - iconSize / 2, center.y() - iconSize * offset1, iconSize, iconSize);
//右侧图标区域
rightRect = QRectF(center.x() + iconSize * (offset1 - 1), center.y() - iconSize / 2, iconSize, iconSize);
//下侧图标区域
bottomRect = QRectF(center.x() - iconSize / 2, center.y() + iconSize * (offset1 - 1), iconSize, iconSize);
//左上角图标区域
leftTopRect = QRectF(center.x() - iconSize * offset2, center.y() - iconSize * offset2, iconSize, iconSize);
//右上角图标区域
rightTopRect = QRectF(center.x() + iconSize * (offset2 - 1), center.y() - iconSize * offset2, iconSize, iconSize);
//左下角图标区域
leftBottomRect = QRectF(center.x() - iconSize * offset2, center.y() + iconSize * (offset2 - 1), iconSize, iconSize);
//右下角图标区域
rightBottomRect = QRectF(center.x() + iconSize * (offset2 - 1), center.y() + iconSize * (offset2 - 1), iconSize, iconSize);
//绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
painter.translate(width / 2, height / 2);
painter.scale(side / 200.0, side / 200.0);
if (cloudStyle == CloudStyle_Black) {
//绘制外圆背景
drawCircle(&painter, 99, bgColor);
//绘制圆弧
drawArc(&painter);
//绘制中间圆盘背景
drawCircle(&painter, 83, baseColor);
//绘制内圆背景
drawCircle(&painter, 40, arcColor);
//绘制内圆边框
drawCircle(&painter, 33, borderColor);
//绘制内圆
drawCircle(&painter, 30, inCenter ? bgColor : baseColor);
} else if (cloudStyle == CloudStyle_White) {
//绘制外圆背景
drawCircle(&painter, 99, QColor(249, 249, 249));
//设置圆锥渐变
QConicalGradient gradient(0, 0, 100);
gradient.setColorAt(0, QColor(34, 163, 169));
gradient.setColorAt(0.4, QColor(240, 201, 136));
gradient.setColorAt(0.7, QColor(211, 77, 37));
gradient.setColorAt(1, QColor(34, 163, 169));
//绘制彩色外圆
drawCircle(&painter, 90, gradient);
//绘制中间圆盘背景
drawCircle(&painter, 83, QColor(245, 245, 245));
//绘制内圆背景
drawCircle(&painter, 33, QColor(208, 208, 208));
//绘制内圆边框
drawCircle(&painter, 32, QColor(208, 208, 208));
//绘制内圆
drawCircle(&painter, 30, inCenter ? QColor(255, 255, 255) : QColor(245, 245, 245));
} else if (cloudStyle == CloudStyle_Blue) {
//设置圆锥渐变
QConicalGradient gradient(0, 0, 100);
gradient.setColorAt(0, QColor(79, 163, 219));
gradient.setColorAt(0.4, QColor(227, 183, 106));
gradient.setColorAt(0.7, QColor(217, 178, 109));
gradient.setColorAt(1, QColor(79, 163, 219));
//绘制色彩外圆
drawCircle(&painter, 99, gradient);
//绘制中间圆盘背景
drawCircle(&painter, 91, QColor(31, 66, 98));
//绘制内圆背景
drawCircle(&painter, 33, QColor(23, 54, 81));
//绘制内圆边框
drawCircle(&painter, 30, QColor(150, 150, 150));
//绘制内圆
drawCircle(&painter, 30, inCenter ? QColor(35, 82, 133) : QColor(34, 73, 115));
} else if (cloudStyle == CloudStyle_Purple) {
//设置圆锥渐变
QConicalGradient gradient(0, 0, 100);
gradient.setColorAt(0, QColor(87, 87, 155));
gradient.setColorAt(0.4, QColor(129, 82, 130));
gradient.setColorAt(0.7, QColor(54, 89, 166));
gradient.setColorAt(1, QColor(87, 87, 155));
//绘制色彩外圆
drawCircle(&painter, 99, gradient);
//绘制中间圆盘背景
drawCircle(&painter, 91, QColor(55, 55, 92));
//绘制内圆背景
drawCircle(&painter, 33, QColor(49, 48, 82));
//绘制内圆边框
drawCircle(&painter, 30, QColor(82, 78, 131));
//绘制内圆
drawCircle(&painter, 30, inCenter ? QColor(85, 81, 137) : QColor(62, 59, 103));
}
//绘制八方位+中间图标
drawText(&painter);
}
void CloudGauge::drawCircle(QPainter *painter, int radius, const QBrush &brush)
{
painter->save();
painter->setPen(Qt::NoPen);
painter->setBrush(brush);
//绘制圆
painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
painter->restore();
}
void CloudGauge::drawArc(QPainter *painter)
{
int radius = 91;
painter->save();
painter->setBrush(Qt::NoBrush);
QPen pen;
pen.setWidthF(10);
pen.setColor(arcColor);
painter->setPen(pen);
QRectF rect = QRectF(-radius, -radius, radius * 2, radius * 2);
painter->drawArc(rect, 0 * 16, 360 * 16);
painter->restore();
}
void CloudGauge::drawText(QPainter *painter)
{
bool ok;
int radiu
![avatar](https://profile-avatar.csdnimg.cn/0a913346418246a999e96eb4a0255ca4_wgj22068.jpg!1)
wgj22068
- 粉丝: 10
- 资源: 52
最新资源
- 基于Springboot的大学生就业服务平台。Javaee项目,springboot项目。
- 基于STM32与FreeRTOS的智能家居设计实践:从代码敲定到秋招应对的全过程详解,STM32与FreeRTOS结合的智能家居设计实战:从代码敲打到秋招面试准备全解析,基于stm32和freerto
- 基于SSM的校园交易平台。Javaee项目。ssm项目。
- 光储并网直流微电网Simulink仿真模型:混合储能与MPPT最大功率输出及二阶低通滤波法应用,光储并网直流微电网Simulink仿真模型:混合储能与MPPT最大功率输出及二阶低通滤波法应用,光储并网
- 使用C语言编程设计的MP3音乐播放器项目的源代码
- DPF转html的Java代码jar包
- 天然气水合物降压开采技术:基于COMSOL热-流-固耦合模拟与多场动态演化分析,天然气水合物降压开采模拟:基于COMSOL热-流-固耦合及储层参数演化研究,包括水平井筒环空高压充填石英砂层的多维模型探
- Fluent金属熔凝学习宝典:涵盖流动传热、激光热源、金属相变、偏析现象及UDF代码详解,Fluent金属熔凝学习资料大全:涵盖流动传热、激光热源、熔化凝固、宏观偏析、激光熔覆及UDF代码详解,flu
- stata18相关数据集.txt
- Pem电解槽等温与非等温阳极流道模型参数化建模:融合多物理场仿真分析,Pem电解槽等温与非等温阳极流道模型参数化建模:结合多物理场仿真优化研究,Pem电解槽等温阳极单侧流道模型,水电解槽模块与自由与多
- 经历BAT面试后总结的【高级Java后台开发面试指南】,纯净干货无废话,针对高频面试点.zip
- 基于Springboot的协同过滤算法商品推荐系统。Javaee项目,springboot项目。
- 基于开源数据集SMART-DS的计及负荷异常增长的空间负荷预测与配电网规划研究:数据清洗、异常增长诊断、集成学习预测、模糊综合评价与选线定容优化技术探讨,基于开源数据集SMART-DS的计及负荷异常增
- 基于SSM的餐厅点菜管理系统(有报告)。Javaee项目。ssm项目。
- 基于Halcon 64位与Qt 5.8的机器视觉缺陷检测C++源码包,支持VS2015编译环境,全源码解析与实现 ,基于Halcon 64位与Qt 5.8的机器视觉缺陷检测C++源码包,支持VS201
- Springboot+vue的企业OA管理系统(有报告),Javaee项目,springboot vue前后端分离项目。
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)