首先绘制区域扇形需要先注意一下几点:

  1. QPainter中绘制完整的圆等于5760(16 * 360),此处数值用于计算每一块扇形区域所显示的

  1. 需要了解一下扇形二等分线的计算方法

  1. 要注意做坐标原点转换

    /*此处为屏幕分辨率自适应*/const qreal ratioW = DesktopResize::GetInstance()->getWidthRatio();const qreal ratioH = DesktopResize::GetInstance()->getHeightRatio();const qreal ratioT = qMin(ratioW, ratioH);// 三角形和凸角必须指定为1/16度,即一个完整的圆等于5760(16 * 360)int circleArea = 5760;         // 设置圆弧显示区域    QRect rect(418 * ratioW, 340 * ratioH, 557  * ratioT, 557 * ratioT);// 圆半径int radius = rect.width() / 2;                  // 起始角度qreal startAngle = 0;// 当前绘制扇形所占角度qreal angle;//文字显示起始角度qreal textStartAngle = 0;// 文字显示角度qreal textAngle;// 需要统计的总数值int totalValue = 0;// _fanDataClassList为一个结构数据list,根据个人需要自行定义// 计算总数值for(int i = 0; i < _fanDataClassList.count(); i++){totalValue += _fanDataClassList.at(i).value;}// 计算每个数值的扇形显示区域for(int i = 0; i < _fanDataClassList.count(); i++){// 设置画笔颜色与画刷颜色保持一致,需要注意此处需要设设置画笔,否则会出现两个扇形之间显示有空白间隙QPen pen(_fanDataClassList.at(i).color, 1, Qt::SolidLine);painter->setPen(pen);// 设置画刷颜色与画笔保持一致painter->setBrush(_fanDataClassList.at(i).color);// 计算当前数值所占的百分比qreal persent = (double)_fanDataClassList.at(i).value / totalValue;// 根据百分比计算当前数值扇形尖角处所占角度的比例angle = circleArea * persent;// 通过path来获取当前绘制的扇形区域QPainterPath path;// 因圆心角需要在中位置来计算,将path起点移动到rect的中点位置path.moveTo(rect.center());// 创建一个占据给定矩形的弧,从指定的startAngle开始,逆时针扩展angle结束// 角度用角度来表示。顺时针弧线可以使用负角度指定。path.arcTo(rect, startAngle / 16, angle / 16);// 此处用来确定鼠标点击区域显示统计数据用,根据个人需要添加_pathValueMap.insert(i, path);// 绘制当前数值所占扇形区域painter->drawPath(path);// 如果不需要获取每块扇形的点击区域也可以直接使用drawPie绘制,就不需要使用path了//        painter->drawPie(rect, startAngle, angle);// 计算下一个扇形的起始角度startAngle += angle;}// 绘制每一块扇形区域的文字数目和占比统计painter->setBrush(Qt::NoBrush);for(int i=0; i < _fanDataClassList.count(); i++){if(_fanDataClassList.at(i).value == 0)continue;// 同样先计算当前数值的占比qreal persent = (double)_fanDataClassList.at(i).value / totalValue;// 计算文字显示角度textAngle = circleArea * persent;//各个对应扇形二等分线的角度qreal abc = 3.14 * 2 * (double)(textStartAngle + textAngle / 2) / circleArea;       // 根据二等分线计算出当前扇形区域边缘的终点坐标qreal valueX = radius * qCos(abc) + radius + rect.x();qreal valueY = -radius * qSin(abc) + radius + rect.y();// 计算终点坐标相对于圆心的坐标用以标定文字的显示方向QPointF point = QPointF(valueX, valueY) - rect.center();int lineX = 0;int lineY = 0;int lineWidth = 0;int textX = 0;// 根据数学坐标系判断该点坐标所处象限if(point.x() > 0 && point.y() < 0){lineX = 30  * ratioW;lineY = -30 * ratioH;lineWidth = 40 * ratioW;textX = valueX + lineX + lineWidth + 10 * ratioW;}else if(point.x() < 0 && point.y() < 0){lineX = -30 * ratioW;lineY = -30 * ratioH;lineWidth = -40 * ratioW;textX = valueX + lineX + lineWidth - 250 * ratioW;}else if(point.x() < 0 && point.y() > 0){lineX = -30 * ratioW;lineY = 30 * ratioH;lineWidth = -40 * ratioW;textX = valueX + lineX + lineWidth - 250 * ratioW;}else if(point.x() > 0 && point.y() > 0){lineX = 30 * ratioW;lineY = 30 * ratioH;lineWidth = 40 * ratioW;textX = valueX + lineX + lineWidth + 10 * ratioW;}// 绘制二等分线和延迟线及文字下划线, 以下代码较为简单就不做注解了QPen pen(_fanDataClassList.at(i).color, 1, Qt::SolidLine);pen.setCapStyle(Qt::RoundCap);pen.setJoinStyle(Qt::RoundJoin);painter->setPen(pen);QVector<QPointF> points;points.push_back(QPointF(valueX, valueY));points.push_back(QPointF(valueX + lineX, valueY + lineY));points.push_back(QPointF(valueX + lineX + lineWidth, valueY + lineY));painter->drawPolyline(QPolygonF(points));QFont font = painter->font();font.setPixelSize(22 * ratioT);font.setWeight(50);font.setBold(true);painter->setFont(font);pen.setColor(Qt::black);painter->setPen(pen);
//        painter->drawText(valueX - 20, valueY, QString("%1%").arg( QString::number((persent * 100), 'f', 1)));if(i == 0){painter->drawText(textX, valueY + lineY + 5 * ratioH, QString("正确率:100% %1人").arg(_fanDataClassList.at(i).value));}else if(i == 1){painter->drawText(textX, valueY + lineY + 5 * ratioH, QString("正确率:90%-99% %1人").arg(_fanDataClassList.at(i).value));}else if(i == 2){painter->drawText(textX, valueY + lineY + 5 * ratioH, QString("正确率:80%-89% %1人").arg(_fanDataClassList.at(i).value));}else if(i == 3){painter->drawText(textX, valueY + lineY + 5 * ratioH, QString("正确率:60%-79% %1人").arg(_fanDataClassList.at(i).value));}else{painter->drawText(textX, valueY + lineY + 5 * ratioH, QString("正确率:0%-59% %1人").arg(_fanDataClassList.at(i).value));}textStartAngle += textAngle;}

效果如图:

Qt自绘控件之扇形统计图相关推荐

  1. Qt界面美化-飞扬青云自绘控件插件的使用-避免采坑

    1.先上一个集成到QtCreater中的效果图: 2.飞扬青云自绘控件插件下载地址:https://gitcode.net/mirrors/feiyangqingyun/qucsdk?utm_sour ...

  2. QT中树控件QTreeView开发实例

    转自:http://mobile.51cto.com/symbian-268700.htm 本文讲解了QT中树控件QTreeView开发实例,对于QTreeView没有过多的讲解,那么不说废话了,看代 ...

  3. 虚拟桌面模拟查找点击自绘控件

    // VDesktopClick.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <string> #inclu ...

  4. QT旋转按钮控件的实现

    目录 一.实现需求:鼠标hover时旋转 二.实现方式:计时器做动画 三.代码实现 QT旋转按钮控件的实现 一.实现需求:鼠标hover时旋转 需求是:实现类似于WINDOWS下,某些软件窗口关闭按钮 ...

  5. Qt Creator 窗体控件自适应窗口大小布局

    常见的软件窗口大小改变(最大化.手动改变时)需要窗口的部件能够自适应布局,而在Qt的应用程序界面设计中,对于像我一样的初学者如何实现窗口自适应调整还是要绕点弯路的.网上百度了很多,多数说的很含糊,还有 ...

  6. Qt QTableWidget表格控件的用法(非常详细)

    Qt QTableWidget表格控件的用法(非常详细) QTableWidget 是 Qt 提供的一种表格控件(如图 1 所示),类似于我们经常使用的 Excel 表格,可以将数据以表格的方式展示给 ...

  7. QT自定义Widget控件及其使用

    今天来给大家分享一下QT自定义widget控件及其使用,当ui设计器提供的界面不满足实际需求时,可以从QWidget继承自定义的界面组件.有两种方法一种是提升法,另一种是ui设计器自定义界面组件wid ...

  8. Qt 之 ActiveX控件跑官方例程记录

    转载自:Qt 之 ActiveX控件跑官方例程记录 通过自己的实践,补充了一些技术细节 目录(?)[-] 开发环境 基础知识了解 QT的ActiveX控件形式 in-process运行的ActiveX ...

  9. qt 容器组控件 Containers

    qt 容器组控件 Containers 控件名: Group Box:组合框,提供带有标题的组合框框架 Scroll Area:滚动区域 Tool Box:工具箱 Tab Widget:标签小部件 S ...

最新文章

  1. VM虚拟机中的centos6.3命令行模式添加GCC
  2. Mac中安装git后,终端运行git出错,提示安装Xcode
  3. ThreadPoolTaskExecutor使用详解
  4. eclipse lombok插件安装_便捷开发,解放双手,lombok插件
  5. flink-faker用法示例(还没弄完,到时候再说)
  6. 文献记录(part81)--Clustering-based k -nearest neighbor classification for large-scale data with ...
  7. tomcat jar包编译后变成文件夹_tomcat学习|tomcat中的类加载器
  8. 在Windows系统中构建还原ASP.NET Core 源码
  9. PCL PCD文件读写
  10. centos 部署.netcore 开发环境
  11. 前端分页插件pagination
  12. MySQL — 使用命令创建数据库、链接数据库、创建表、查询表数、删除表
  13. 12.看板方法---度量和管理报告
  14. WPS怎么转成PPT文件
  15. 计算机刷bios版本,主板刷bios的6种方法,电脑刷bios方法-
  16. 百度地图,定位,添加图标
  17. 【Red Team——基础】通过钓鱼攻击获得访问权限
  18. Scratch教程——完整的跳跃
  19. 程序员必备的提升工作效率的方法
  20. Android磁盘管理-之vold源码分析(2)

热门文章

  1. SpringBoot-07-之数据库JPA(CRUD)
  2. 程序代码初学者_初学者极客:在Windows 7和Vista中设置默认程序
  3. 深蹲的好处--试了几天,真的不错!(特别是脊椎,肩膀,我不是广告=。=)
  4. ChatDoctor本地部署应用的实战方案
  5. JS控制全屏,监听退出全屏事件
  6. Newtonsoft.Json
  7. Windows10蓝屏解决方案
  8. Java计算字符串中的英文字母的个数
  9. http://bbs.duowan.com/forum.php,多玩论坛为什么关闭了 多玩游戏论坛关闭业务升级公告...
  10. QML 窗口失去焦点、任务栏图标隐藏