绘制饼状图qt就有现成的函数来用,要在相应部分的弧形里显示百分比就需要做一点处理。

做法就是在获取扇形二等分线的中点坐标,以这个中点坐标为中心的一个区域再绘制文字。

获取中点坐标使用三角函数即可,半径懂,角度也有,很容易就算出距离,再根据所在的象限添加符号就是坐标了

效果图:

下面上代码

头文件

#include <QWidget>
#include <QPainter>
#include <QMap>class ArcWidget : public QWidget
{Q_OBJECTpublic:explicit ArcWidget(QWidget *parent = 0);~ArcWidget();protected:void paintEvent(QPaintEvent *e);private:QString getPercentInt(const QString &percentStr);private:QMap<QString, int> m_answerMap;QList<int> m_numList;QList<QString> m_answerStrList;int m_nPeopleCount;qreal m_pi = 3.1415;};

cpp文件

#include "arcwidget.h"ArcWidget::ArcWidget(QWidget *parent): QWidget(parent), m_nPeopleCount(0)
{this->resize(600, 600);m_answerMap.insert("A", 3);m_answerMap.insert("B", 5);m_answerMap.insert("C", 8);m_answerMap.insert("D", 2);m_answerStrList = m_answerMap.keys();m_numList = m_answerMap.values();foreach (int num, m_numList) {m_nPeopleCount += num;}
}ArcWidget::~ArcWidget()
{}void ArcWidget::paintEvent(QPaintEvent *e)
{QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);painter.setPen(Qt::NoPen);painter.setBrush(Qt::NoBrush);
//    painter.drawImage(this->rect(),m_bg);QRectF rect(-120, -120,(120 << 1), (120 << 1));QList<QColor> colorList;painter.translate(220, 255);qreal startAngle = 0;foreach (int num, m_numList) {//生成随机颜色并过滤掉白色int colorR, colorG, colorB;while(1){colorR = rand()%256;colorG = rand()%256;colorB = rand()%256;if(colorR == 255 && colorG == 255 && colorB == 255){continue;}else{break;}}QColor color(colorR, colorG, colorB);colorList.append(color);painter.setPen(Qt::NoPen);painter.setBrush(QBrush(color));//该答案选项所占比例qreal percentNum = (qreal)num/(qreal)m_nPeopleCount;//所占比例对应的角度qreal arcLength = 360*percentNum;//画扇形QPainterPath path;path.arcTo(rect, startAngle, arcLength);//扇形二等分线的角度qreal middleAngle = startAngle + arcLength/2;qreal radianNum = 0;if(middleAngle >= 0 && middleAngle < 90){radianNum = middleAngle*m_pi/180;}else if(middleAngle >= 90 && middleAngle < 180){radianNum = (180 - middleAngle)*m_pi/180;}else if(middleAngle >= 180 && middleAngle < 270){radianNum = (middleAngle - 180)*m_pi/180;}else if(middleAngle >= 270 && middleAngle < 360){radianNum = (360 - middleAngle)*m_pi/180;}//二等分线的中点距原点的距离qreal textPosY = 60*sin(radianNum);qreal textPosX = 60*cos(radianNum);//根据二等分线所在的象限确定二等分线的中点坐标if(middleAngle >= 0 && middleAngle < 90){textPosY = -textPosY;}else if(middleAngle >= 90 && middleAngle < 180){textPosX = -textPosX;textPosY = -textPosY;}else if(middleAngle >= 180 && middleAngle < 270){textPosX = -textPosX;}startAngle += arcLength;QString percentStr = QString::number(percentNum*100 + 0.5);percentStr = getPercentInt(percentStr) + "%";painter.drawPath(path);painter.setPen(QColor(Qt::white));painter.drawText(textPosX - 25, textPosY -10,50, 20, Qt::AlignCenter, percentStr);}painter.setBrush(Qt::NoBrush);painter.setPen(QColor(0, 0, 0));painter.translate(-220, -255);//绘制右侧的标注栏QFont ft;ft.setPixelSize(15);painter.setFont(ft);int textStart = 140;foreach (QString answerStr, m_answerStrList) {painter.drawText(350, textStart,40, 16,Qt::AlignRight, answerStr);textStart += 30;}textStart = 143;painter.setPen(Qt::NoPen);foreach (QColor color, colorList) {painter.setBrush(QBrush(color));painter.drawRect(402, textStart, 15, 15);textStart += 30;}QWidget::paintEvent(e);
}QString ArcWidget::getPercentInt(const QString &percentStr)
{QString percentIntStr;for(int i = 0;i < percentStr.size();++i){if(percentStr.at(i) == '.'){break;}percentIntStr += percentStr.at(i);}return percentIntStr;
}

使用QPainter绘制饼状图,并显示所占百分比相关推荐

  1. 第166天:canvas绘制饼状图动画

    canvas绘制饼状图动画 1.HTML 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 < ...

  2. Python绘制饼状图对商品库存进行分析

    人生苦短,我用Python 一.序言 二.知识点 三.效果展示 四.代码展示 一.序言 今天来实践一下如何用Python对商品库存绘制饼状图进行分析 二.知识点 文件读写 基础语法 字符串处理 文件生 ...

  3. python使用matplotlib绘制饼状图

    python使用matplotlib绘制饼状图 Python绘图需要下载安装matplotlib模块,它是一个数学绘图库,我们将使用它来制作简单的图表. 绘制饼状图 代码一: import matpl ...

  4. 年末盘点时间——用Python绘制饼状图对商品库存进行分析

    人生苦短,我用python 存货盘点最重要的是什么,盘点比例要达到, 比如说要达到80%,于是就拿着企业给导的进销存明细表, 于是就开始筛选大金额的存货作为选择的样本, 这样就够比例了. 可是实际盘点 ...

  5. 【Python 实战基础】如何绘制饼状图分析商品库存

    目录 一.实战场景 二.主要知识点 文件读写 基础语法 字符串处理 文件生成 数据构建 三.菜鸟实战 1.创建 python 文件 2.运行结果 一.实战场景 实战场景:如何绘制饼状图分析商品库存 二 ...

  6. python绘制饼状图图例_python matplotlib饼状图参数及用法解析

    这篇文章主要介绍了python matplotlib饼状图参数及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在python的matplo ...

  7. 年末大清仓,用Python绘制饼状图对商品库存进行分析

    前言 这不是都要回家过年了 很多店家都开始了年末大清仓,很多东西开始甩卖(咳咳.吐槽一下.很多都是挂个牌子说清仓甩卖.结果有些的卖的还更贵些) 不扯那么多,今天分享一下如何用python绘制饼状图多商 ...

  8. Python绘制饼状图/甜甜圈

    Python Matplotlib.pyplot Matplotlib库是一个面向对象的绘图库.绘图界面由pyplot模块提供.该模块提供了许多绘图函数,以下记录的是饼状图/甜甜圈图的相关参数和绘图过 ...

  9. QT绘制饼状图QChartView

    QT绘制饼状图QChartView 介绍 Demo 介绍 首先要在pro里加上 QT += charts 然后添加以下 #include <QtCharts> using namespac ...

  10. uni-app 之canvas绘制饼状图

    uni-app 之canvas绘制饼状图 一开始,对于canvas我是拒绝的,后来,我发现我爱上了它,像爱上小哥哥一样~~ 说起canvas,是css3新增的标签.而饼状图又是canvas经典,我们公 ...

最新文章

  1. Drug Discov. Today | 简要综述GNNs用于分子性质预测
  2. Python-EEG工具库MNE中文教程(13)-“bad“通道介绍
  3. 【原】 动态加载dll
  4. 工作中这些实用的小技巧,90%的程序员不知道
  5. php 按条件进行计算的方法
  6. [转载] python面面观单元测试_python 使用unittest进行单元测试
  7. centos rpm安装mysql5.6_CentOS 7下使用RPM安装MySQL 5.6
  8. MySQL技术内幕:InnoDB存储引擎
  9. 视频会议系统gk服务器,TENKING- 远程视频会议系统
  10. Jmeter 修改背景色和字体
  11. 两难选择:继续工作还是考研
  12. VSCode正则表达式搜索
  13. 针对《面试心得与总结—BAT、网易、蘑菇街》一文中出现的技术问题的收集与整理...
  14. 超低功耗离线智能语音识别芯片AT6811
  15. 海量数据处理的 Top K算法(问题) 小顶堆实现
  16. 无法正常启动0xc0000142的错误
  17. 虚拟机Win 7中重新 划分 分区 合并 磁盘
  18. Python实现图片中英文信息识别
  19. 打开和关闭HDMI输出方法
  20. 30天自制操作系统:第十天 叠加处理

热门文章

  1. win10永久设置护眼颜色
  2. 元宇宙如何改变人类社会生活。
  3. java 处理汉字枚举类_浅谈java枚举类(附代码)
  4. python PDF解密打印文件
  5. matlab 改变图片比例尺,ps修改图片尺寸和比例尺方法图解
  6. pyplot输出的绘图界面出现中文乱码的解决方案
  7. re 中 报错 no such group
  8. JAVA 通过POI实现Excel从单元格选择下拉选项
  9. Android 电话的国家代码
  10. 打开计算机文件反应慢怎么解决方法,电脑反应慢怎么办?常见原因与解决办法...