做得比较low

#ifndef TEST_POWER_H
#define TEST_POWER_H#include <QWidget>
#include <QtMath>
#include <QPainter>
#include <QPushButton>
#include <QVector>
#include <cmath>namespace Ui {
class test_power;
}
struct PieData
{QString name;   //名称int num;        //数量QColor color;   //颜色PieData(QString name,int num,QColor color){this->name = name;this->num = num;this->color = color;}
};struct shanxing{double zhanbi;double start_x;double start_y;double end_x;double end_y;
};class test_power : public QWidget
{Q_OBJECTpublic:explicit test_power(int dongli=0,int zhaoming=0,int kongtiao=0,int teshu=0,int clicked=1000,QWidget *parent = nullptr);~test_power();QVector<QPointF> a;int m_proportion[4],clicked_code;void initWidget();//圆环图各参数函数接口void setRadiusLong(int radius_long);void setRadius(int radius);void setInnerWidth(int width);void setCenter(QPoint center);void setStartAngle(qreal startAngle);void setTextDistance(int textDistance);void setPieData(QVector<PieData> vData);void refreshChart();shanxing my_shanxing[4];int m_radius,m_radius_long;         //外圆半径int m_innerWidth;     //圆环内径QPoint m_center;      //圆心坐标qreal m_startAngle;   //圆环绘制起点int m_textDistance;   //文本与圆心的距离qreal m_totality;     //总数QVector<PieData> m_vData;   //数据容器QPointF getArcPoint(const QPoint &center, int radius, double angle);void calculateArcPoints(QPainter &painter, const QPoint &center, int radius, double startAngle, double sweepLength,int i);
protected:void paintEvent(QPaintEvent *);void mousePressEvent(QMouseEvent *event);
private slots:
//    void on_pb_test_clicked();
//    void pb_clicked();
private:Ui::test_power *ui;
signals:
//传出你想要传出的参数void notice_clicked(int);};#endif // TEST_POWER_H
#include "test_power.h"
#include "ui_test_power.h"
#include <QDebug>
#include <QMouseEvent>test_power::test_power(int dongli,int zhaoming,int kongtiao,int teshu,int clicked,QWidget *parent) :QWidget(parent),ui(new Ui::test_power)
{ui->setupUi(this);setAttribute(Qt::WA_DeleteOnClose);setWindowFlags(Qt::FramelessWindowHint);this->initWidget();m_proportion[0] = dongli;m_proportion[1] = zhaoming;m_proportion[2] = kongtiao;m_proportion[3] = teshu;clicked_code = clicked;//设置圆环各参数this->setRadius(160);this->setRadiusLong(190);this->setInnerWidth(0);   //设为0即为饼图this->setCenter(QPoint(275,275));this->setStartAngle(0);   //区域绘制方向为逆时针this->setTextDistance(210);this->refreshChart();
}test_power::~test_power()
{delete ui;
}//初始化界面
void test_power::initWidget()
{//初始化变量m_radius = 0;m_radius_long=0;m_innerWidth = 0;m_center = QPoint(0,0);m_startAngle = 0;m_textDistance = 0;m_totality = 0;m_vData.clear();
}
//设置外圆长半径
void test_power::setRadiusLong(int radius_long)
{m_radius_long=radius_long;
}
//设置外圆半径
void test_power::setRadius(int radius)
{m_radius = radius;
}//设置圆环内径
void test_power::setInnerWidth(int width)
{m_innerWidth = width;
}//设置圆心
void test_power::setCenter(QPoint center)
{m_center = center;
}//设置圆环绘制起点
void test_power::setStartAngle(qreal startAngle)
{m_startAngle = startAngle;
}//设置文本与圆心的距离
void test_power::setTextDistance(int textDistance)
{m_textDistance = textDistance;
}//设置饼图数据
void test_power::setPieData(QVector<PieData> vData)
{//获取数据m_vData = vData;//获取总数m_totality = 0;for(int i=0;i<m_vData.size();i++){m_totality += m_vData[i].num;}this->update();
}//更新饼图
void test_power::refreshChart()
{//设置圆环图各区域数据名称及颜色QVector<PieData> vData;QColor m_colors[4] = {QColor(237,117,57),QColor(111,173,30),QColor(198,49,16),QColor(248,206,34)};QString m_names[4] = {"quyu1","quyu2","quyu3","quyu4"};for(int i=0;i<4;i++){if(!m_names[i].isEmpty() && m_proportion[i]>0){PieData data = PieData(QString("%1\n%2").arg(m_names[i]).arg(QString::number(m_proportion[i])+"%"),m_proportion[i],m_colors[i]);vData.push_back(data);}}this->setPieData(vData);
}//重写绘图事件
void test_power::paintEvent(QPaintEvent *)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing,true);   //抗锯齿//绘制圆角背景painter.setBrush(Qt::transparent);painter.setPen(Qt::NoPen);   //去除背景边框painter.drawRoundedRect(10,10,360,360,8,8);//绘制饼图qreal startAngle = m_startAngle;   //绘制起点qreal spanAngle = 0;   //各区域占比,覆盖角度for(int i=0;i<m_vData.size();i++){painter.setPen(m_vData[i].color);painter.setBrush(m_vData[i].color);if(m_totality)   //防止总数为0{spanAngle = m_vData[i].num * 360 / m_totality;my_shanxing[i].zhanbi = m_vData[i].num / m_totality;}if(i==clicked_code){painter.drawPie(m_center.x() - m_radius_long,m_center.y() - m_radius_long,m_radius_long * 2,m_radius_long * 2,startAngle * 16,spanAngle * 16);}else{painter.drawPie(m_center.x() - m_radius,m_center.y() - m_radius,m_radius * 2,m_radius * 2,startAngle * 16,spanAngle * 16);}calculateArcPoints(painter, m_center,m_radius,startAngle,spanAngle,i);startAngle += spanAngle;}//绘制区域名称和占比startAngle = m_startAngle;spanAngle = 0;for(int i=0;i<m_vData.size();i++){painter.setPen(QColor("#ffffff"));painter.setFont(QFont("STSongti-SC-Bold, STSongti-SC",16));if(m_totality){spanAngle = m_vData[i].num * 360 / m_totality;}int textAngle = startAngle + spanAngle / 2;QString text = QString("%1").arg(m_vData[i].name);int textWidth = painter.fontMetrics().horizontalAdvance(text);int textHeight = painter.fontMetrics().height();int textX = m_center.x() + m_textDistance * qCos(textAngle * M_PI / 180) - textWidth / 2;int textY = m_center.y() - m_textDistance * qSin(textAngle * M_PI / 180) + textHeight / 2;startAngle += spanAngle;//绘制文本QRect rect(textX,textY - textHeight,textWidth + 10,textHeight * 2);painter.drawText(rect,Qt::AlignCenter,text);//绘制连接线,文本要靠近对应区域,需要修改连接线终点位置painter.setPen(m_vData[i].color);int lineStartX = m_center.x() + (m_radius - 10) * qCos(textAngle * M_PI / 180);int lineStartY = m_center.y() - (m_radius - 10) * qSin(textAngle * M_PI / 180);int lineEndX = 0;int lineEndY = 0;if(textX < lineStartX)   //文本在左边{//可自行根据实际进行位置偏移的修改lineEndX = textX + textWidth/2;if(textY < lineStartY)   //文本在上边{lineEndY = textY + textHeight + 5;}else{lineEndY = textY - textHeight - 5;}}else{lineEndX = textX + textWidth/2;if(textY < lineStartY){lineEndY = textY;}else{lineEndY = textY - textHeight - 5;}}painter.drawLine(lineStartX,lineStartY,lineEndX,lineEndY);//绘制终点painter.setPen(QPen(m_vData[i].color,5));painter.drawPoint(lineEndX,lineEndY);//将终点设为空心圆//painter.drawEllipse(QPoint(lineEndX,lineEndY),5,5);//painter.setPen(QPen(QColor("#FFFFFF"),1));//painter.setBrush(QColor("#FFFFFF"));//painter.drawEllipse(QPoint(lineEndX,lineEndY),3,3);}//绘制内圆,将饼图变为圆环painter.setPen(QPen(QColor("#FFFFFF"),10));painter.setBrush(QColor("#FFFFFF"));painter.drawEllipse(m_center,m_innerWidth,m_innerWidth);
}void test_power::mousePressEvent(QMouseEvent *event)
{QPoint mousePos = event->pos();double x = mousePos.x()- m_center.x();if(x==0){return;}double y =  m_center.y() - mousePos.y();if(y==0){return;}if(  x*x + y*y < m_radius*m_radius){// 输出或使用坐标点
//        qDebug() << "Mouse pressed at position:" << x << "," << y;if(x>0 && y>0 ){double zhanbi=0;for (int i=0;i<4;i++){zhanbi += my_shanxing[i].zhanbi;if(zhanbi<0.25 && y/x>my_shanxing[i].start_y/my_shanxing[i].start_x && y/x<my_shanxing[i].end_y/my_shanxing[i].end_x){qDebug()<<"clicked ============"<<i;emit notice_clicked(i);return;}if(zhanbi>=0.25) {qDebug()<<"clicked ============"<<i;emit notice_clicked(i);return;}}}else if(x<0 && y>0 ){double zhanbi=0;for (int i=0;i<4;i++){zhanbi += my_shanxing[i].zhanbi;if(zhanbi>0.25 && zhanbi<=0.5){if(my_shanxing[i].start_x>=0){//起始位置在第一象限if(y/x<my_shanxing[i].end_y/my_shanxing[i].end_x){qDebug()<<"clicked ============"<<i;emit notice_clicked(i);return;}}else{//起始位置在第二象限if(y/x>my_shanxing[i].start_y/my_shanxing[i].start_x && y/x<my_shanxing[i].end_y/my_shanxing[i].end_x){qDebug()<<"clicked ============"<<i;emit notice_clicked(i);return;}}}if(zhanbi>0.5) {qDebug()<<"clicked ============"<<i;emit notice_clicked(i);return;}}}else if(x<0 && y<0 ){double zhanbi=0;for (int i=0;i<4;i++){zhanbi += my_shanxing[i].zhanbi;if(zhanbi>0.5 && zhanbi<=0.75){if(my_shanxing[i].start_y>=0){//起始位置在第一或者第二象限if(y/x<my_shanxing[i].end_y/my_shanxing[i].end_x){qDebug()<<"clicked ============"<<i;return;}}else{//起始位置在第三象限if(y/x>my_shanxing[i].start_y/my_shanxing[i].start_x && y/x<my_shanxing[i].end_y/my_shanxing[i].end_x){qDebug()<<"clicked ============"<<i;return;}}}if(zhanbi>0.75) {qDebug()<<"clicked ============"<<i;emit notice_clicked(i);return;}}}else if(x>0 && y<0 ){double zhanbi=0;for (int i=0;i<4;i++){zhanbi += my_shanxing[i].zhanbi;if(zhanbi>0.75){if(my_shanxing[i].start_y>=0 || (my_shanxing[i].start_y<=0 && my_shanxing[i].start_x<=0)){//起始位置位于一或者二或者三象限if(y/x<my_shanxing[i].end_y/my_shanxing[i].end_x){qDebug()<<"clicked ============"<<i;emit notice_clicked(i);return;}}else{
//                        qDebug()<<"iiiiiiiiiiiiiiiiii="<<i<<"=="<<y/x<<"==="<<my_shanxing[i].start_y/my_shanxing[i].start_x<<"------"<<my_shanxing[i].end_y/my_shanxing[i].end_x;
//                        qDebug()<<i<<"==y="<<y<<"   x="<<x<<"===y="<<my_shanxing[i].start_y<<"===x"<<my_shanxing[i].start_x<<"------y="<<my_shanxing[i].end_y<<"   x="<<my_shanxing[i].end_x;if(y/x>my_shanxing[i].start_y/my_shanxing[i].start_x && y/x<my_shanxing[i].end_y/my_shanxing[i].end_x){qDebug()<<"clicked ============"<<i;emit notice_clicked(i);return;}}}}}}
}void test_power::calculateArcPoints(QPainter &painter, const QPoint &center, int radius, double startAngle, double sweepLength,int inum) {QPointF startPoint = getArcPoint(center, radius, startAngle);QPointF endPoint = getArcPoint(center, radius, startAngle + sweepLength);my_shanxing[inum].start_x=startPoint.x()-m_center.x();my_shanxing[inum].start_y= m_center.y()-startPoint.y();my_shanxing[inum].end_x= endPoint.x()-m_center.x();my_shanxing[inum].end_y= m_center.y()-endPoint.y();// 这里可以处理startPoint和endPoint,例如绘制线条或进行其他操作
//     painter.drawLine(startPoint, endPoint); // 示例:绘制扇形边界线
//     qDebug()<<"startPoint x="<<my_shanxing[inum].start_x<<"    y="<<my_shanxing[inum].start_y;
//     qDebug()<<"endPoint x="<<my_shanxing[inum].end_x<<"    y="<<my_shanxing[inum].end_y;}QPointF test_power::getArcPoint(const QPoint &center, int radius, double angle) {double radian = angle * M_PI / 180; // 将角度转换为弧度return QPointF(center.x() + radius * cos(radian), center.y() - radius * sin(radian));}

在这里插入图片描述
ui里面就很简单只要设置尺寸就行了

调用时候的代码
//加载饼状图
dongli=20;zhaoming=30;kongtiao=40;teshu=20;
my_test_power = new test_power(dongli,zhaoming,kongtiao,teshu);
connect(my_test_power,SIGNAL(notice_clicked(int)),this,SLOT(refresh_power(int)));
test_power_list.append(my_test_power);
glayout_power = new QVBoxLayout();
glayout_power->addWidget(my_test_power);
ui->frame->setLayout(glayout_power);

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

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

相关文章

HashMap的put、get方法详解(附源码)

put方法 HashMap 只提供了 put 用于添加元素&#xff0c;putVal 方法只是给 put 方法调用的一个方法&#xff0c;并没有提供给用户使用。 对 putVal 方法添加元素的分析如下&#xff1a;如果定位到的数组位置没有元素 就直接插入。如果定位到的数组位置有元素就和要插入的 key …

双立柱式带锯床cad【1张总图】+设计说明书+绛重

双立柱式带锯床 摘 要 随着机械制造技术的进步&#xff0c;制造业对于切割设备的精度、效率和稳定性要求越来越高。双立柱式带锯床作为一种重要的切割设备&#xff0c;必须能够满足工业生产对于高精度、高效率的需求。 双立柱式带锯床是一种重要的工业切割设备&#xff0c;其结…

在线JS解密加密配合ECC保护

在线JS解密加密配合ECC保护 1. ECC加密简介 定义 ECC&#xff08;Elliptic Curve Cryptography&#xff09;是一种基于椭圆曲线数学的公钥加密技术&#xff0c;利用椭圆曲线离散对数问题&#xff08;ECDLP&#xff09;实现高安全性。 背景 1985年&#xff1a;Koblitz&#xff0…

使用 Docker Compose 简化 INFINI Console 与 Easysearch 环境搭建

前言回顾 在上一篇文章《搭建持久化的 INFINI Console 与 Easysearch 容器环境》中&#xff0c;我们详细介绍了如何使用基础的 docker run 命令&#xff0c;手动启动和配置 INFINI Console (1.29.6) 和 INFINI Easysearch (1.13.0) 容器&#xff0c;并实现了关键数据的持久化&…

Word 怎么让段落对齐,行与行之间宽一点?

我们来分两步解决&#xff1a;段落对齐 和 调整行距。 这两个功能都集中在Word顶部的【开始】选项卡里的【段落】区域。 第一步&#xff1a;让段落对齐 “对齐”指的是段落的左右边缘如何排列。通常有四种方式。 操作方法&#xff1a;将鼠标光标点在你想修改的那个段落里的任意…

Attention机制完全解析:从原理到ChatGPT实战

一、Attention的本质与计算步骤 1.1 核心思想 动态聚焦&#xff1a;Attention是一种信息分配机制&#xff0c;让模型在处理输入时动态关注最重要的部分。类比&#xff1a;像人类阅读时用荧光笔标记关键句子。 1.2 计算三步曲&#xff08;以"吃苹果"为例&#xff09; …

2025年3月青少年电子学会等级考试 中小学生python编程等级考试三级真题答案解析(判断题)

博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解

HTML5 新特性详解:从语义化到多媒体的全面升级

很多小伙伴本都好奇&#xff1a;HTML5有什么功能是以前的HTML没有的&#xff1f; 今天就给大家说道说道 HTML5 作为 HTML 语言的新一代标准&#xff0c;带来了诸多革命性的新特性。这些特性不仅简化了前端开发流程&#xff0c;还大幅提升了网页的用户体验和功能性。本文将深入…

mac安装docker

1、下载docker-desktop https://www.docker.com/products/docker-desktop/2、安装&#xff0c;双击安装 3、优化docker配置 默认配置 cat ~/Library/Group\ Containers/group.com.docker/settings-store.json {"AutoStart": false,"DockerAppLaunchPath": …

mapbox进阶,绘制不随地图旋转的矩形,保证矩形长宽沿屏幕xy坐标方位

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️line线图层样式1.4 ☘️circle点图层样…

${project.basedir}延申出来的Maven内置的一些常用属性

如&#xff1a;${project.basedir} 是 Maven 的内置属性&#xff0c;可以被 pom.xml 直接识别。它表示当前项目的根目录&#xff08;即包含 pom.xml 文件的目录&#xff09;。 Maven 内置的一些常用属性&#xff1a; 项目相关&#xff1a; ${project.basedir} <!-- 项…

[特殊字符] Python 批量生成词云:读取词频 Excel + 自定义背景 + Excel to.png 流程解析

本文展示如何用 Python 从之前生成的词频 Excel 文件中读取词频数据&#xff0c;结合 wordcloud 和背景图&#xff0c;批量生成直观美观的词云图。适用于文本分析、内容展示、报告可视化等场景。 &#x1f4c2; 第一步&#xff1a;读取所有 Excel 词频文件 import os from ope…

模拟网络请求的C++类设计与实现

在C开发中&#xff0c;理解和模拟网络请求是学习客户端-服务器通信的重要一步。本文将详细介绍一个模拟HTTP网络请求的C类库设计&#xff0c;帮助开发者在不涉及实际网络编程的情况下&#xff0c;理解网络请求的核心概念和工作流程。 整体架构设计 这个模拟网络请求的类库主要由…

移动机器人的认知进化:Deepoc大模型重构寻迹本质

统光电寻迹技术已逼近物理极限。当TCRT5000传感器在强烈环境光下失效率超过37%&#xff0c;当PID控制器在路径交叉口产生63%的决策崩溃&#xff0c;工业界逐渐意识到&#xff1a;导引线束缚的不仅是车轮&#xff0c;更是机器智能的演化可能性。 ​技术破局点出现在具身认知架构…

记录一次pip安装错误OSError: [WinError 32]的解决过程

因为要使用 PaddleOCR&#xff0c;需要安装依赖。先通过 conda新建了虚拟环境&#xff0c;然后安装 PaddlePaddle&#xff0c;继续安装 PaddleOCR&#xff0c;上述过程我是在 VSCode的终端中处理&#xff0c;结果报错如下&#xff1a;Downloading multidict-6.6.3-cp312-cp312-…

后端id设置long类型时,传到前端,超过19位最后两位为00

文章目录一、前言二、问题描述2.1、问题背景2.2、问题示例三、解决方法3.1、将ID转换为字符串3.2、使用JsonSerialize注解3.3、使用JsonFormat注解一、前言 在后端开发中&#xff0c;我们经常会遇到需要将ID作为标识符传递给前端的情况。当ID为long类型时&#xff0c;如果该ID…

SpringAI学习笔记-MCP客户端简单示例

MCP客户端是AI与外部世界交互的桥梁。在AI系统中&#xff0c;大模型虽然具备强大的认知能力&#xff0c;却常常受限于数据孤岛问题&#xff0c;无法直接访问外部工具和数据源。MCP协议应运而生&#xff0c;作为标准化接口解决这一核心挑战。该协议采用客户端-服务端架构&#x…

postgresql|数据库|系统性能监控视图pg_stat与postgresql数据库的调优(备忘)

一、 写作初衷 通常,我们使用navicat这样的数据库图形管理工具,只能看到用户层面的表,视图,而系统层面的表,视图,函数是无法看到的,这些表,视图和函数好像也可以称之为内模式;而这些视图,函数的作用是非常大的,其中pg_stat 族系统视图可以得到数据库的详细运行信息…

网络安全护网实战:攻击手段解析与防御策略

在网络安全领域&#xff0c;护网行动中对各类攻击方式和漏洞原理的掌握至关重要。本文将详细解析常见的攻击方式及其背后的漏洞原理&#xff0c;帮助大家提升护网技能。一、常见攻击方式及漏洞原理1. SQL注入漏洞• 定义&#xff1a;将恶意的数据库语句注入到后台数据库去执行&…

使用alist+RaiDrive+webdav将百度夸克网盘变为本地电脑磁盘方法教程

由于每天都要操作网盘不下十几次&#xff0c;频繁启动网盘比较麻烦。 使用百度夸克网盘的webdav服务可以将百度夸克网盘挂载到本地电脑上&#xff0c;就像操作本地电脑硬盘一样操作网盘&#xff0c;非常方便。我们以alistraidrive为例演示。 首先打开百度网盘pan.baidu.com&a…