使用QPainter绘制饼状图,并显示所占百分比
绘制饼状图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绘制饼状图,并显示所占百分比相关推荐
- 第166天:canvas绘制饼状图动画
canvas绘制饼状图动画 1.HTML 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 < ...
- Python绘制饼状图对商品库存进行分析
人生苦短,我用Python 一.序言 二.知识点 三.效果展示 四.代码展示 一.序言 今天来实践一下如何用Python对商品库存绘制饼状图进行分析 二.知识点 文件读写 基础语法 字符串处理 文件生 ...
- python使用matplotlib绘制饼状图
python使用matplotlib绘制饼状图 Python绘图需要下载安装matplotlib模块,它是一个数学绘图库,我们将使用它来制作简单的图表. 绘制饼状图 代码一: import matpl ...
- 年末盘点时间——用Python绘制饼状图对商品库存进行分析
人生苦短,我用python 存货盘点最重要的是什么,盘点比例要达到, 比如说要达到80%,于是就拿着企业给导的进销存明细表, 于是就开始筛选大金额的存货作为选择的样本, 这样就够比例了. 可是实际盘点 ...
- 【Python 实战基础】如何绘制饼状图分析商品库存
目录 一.实战场景 二.主要知识点 文件读写 基础语法 字符串处理 文件生成 数据构建 三.菜鸟实战 1.创建 python 文件 2.运行结果 一.实战场景 实战场景:如何绘制饼状图分析商品库存 二 ...
- python绘制饼状图图例_python matplotlib饼状图参数及用法解析
这篇文章主要介绍了python matplotlib饼状图参数及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在python的matplo ...
- 年末大清仓,用Python绘制饼状图对商品库存进行分析
前言 这不是都要回家过年了 很多店家都开始了年末大清仓,很多东西开始甩卖(咳咳.吐槽一下.很多都是挂个牌子说清仓甩卖.结果有些的卖的还更贵些) 不扯那么多,今天分享一下如何用python绘制饼状图多商 ...
- Python绘制饼状图/甜甜圈
Python Matplotlib.pyplot Matplotlib库是一个面向对象的绘图库.绘图界面由pyplot模块提供.该模块提供了许多绘图函数,以下记录的是饼状图/甜甜圈图的相关参数和绘图过 ...
- QT绘制饼状图QChartView
QT绘制饼状图QChartView 介绍 Demo 介绍 首先要在pro里加上 QT += charts 然后添加以下 #include <QtCharts> using namespac ...
- uni-app 之canvas绘制饼状图
uni-app 之canvas绘制饼状图 一开始,对于canvas我是拒绝的,后来,我发现我爱上了它,像爱上小哥哥一样~~ 说起canvas,是css3新增的标签.而饼状图又是canvas经典,我们公 ...
最新文章
- Drug Discov. Today | 简要综述GNNs用于分子性质预测
- Python-EEG工具库MNE中文教程(13)-“bad“通道介绍
- 【原】 动态加载dll
- 工作中这些实用的小技巧,90%的程序员不知道
- php 按条件进行计算的方法
- [转载] python面面观单元测试_python 使用unittest进行单元测试
- centos rpm安装mysql5.6_CentOS 7下使用RPM安装MySQL 5.6
- MySQL技术内幕:InnoDB存储引擎
- 视频会议系统gk服务器,TENKING- 远程视频会议系统
- Jmeter 修改背景色和字体
- 两难选择:继续工作还是考研
- VSCode正则表达式搜索
- 针对《面试心得与总结—BAT、网易、蘑菇街》一文中出现的技术问题的收集与整理...
- 超低功耗离线智能语音识别芯片AT6811
- 海量数据处理的 Top K算法(问题) 小顶堆实现
- 无法正常启动0xc0000142的错误
- 虚拟机Win 7中重新 划分 分区 合并 磁盘
- Python实现图片中英文信息识别
- 打开和关闭HDMI输出方法
- 30天自制操作系统:第十天 叠加处理