QCharts-QPieSeries QPieSlice饼图详解

本文介绍了Qt库中用于创建饼图的相关类,如QChartView、QChart、QPieSeries和QPieSlice,并展示了如何通过它们来构建饼图。同时,详细列举了饼图及系列数据的属性,包括动画、背景、尺寸、颜色等可定制的参数,以及如何修改这些属性以实现更丰富的视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、饼图

在这里插入图片描述

饼图可以表现各分量占总量的关系,以及各分量之间的大小对比关系。

二、Qt饼图的基本元素

基本对象元素,QChartView,QChart,QPieSeries,QPieSlice

  1. QChartView :is a standalone widget that can display charts.
 QChartView是绘制chart图像的控件。
  1. QChart: is a class manages the graphical representation of the chart’s series, legends, and axes.
QChart是管理数据图像元素的类,这些元素包括数据、图例、坐标轴等。
  1. QPieSeires: is a class presents data in pie charts
QPieSeires是饼图切片数据的集合。
  1. QPieSlice: is a class represents a single slice in a pie series.
    QPieSlice 是单个切片的数据。

跟饼图相关的对象之间的关系

注: 含有多个切片的series 加入到一个Qchart中以后,不会画出多个饼图,而是把这些数据集合成一个饼图的series数据。

三、饼图创建

  1. 添加Qt Chart模块和依赖
    .pro文件添加 chart模块
//	.pro文件添加 chart模块
QT       += core gui  charts

// 头文件添加QtChart 相关的依赖依赖和QPieSice
#include <QtCharts>
#include <QChartView>
#include <QPieSeries>
#include <QPieSlice>
  1. 创建QPieSlice切片对象
//QPieSlice(QString label, qreal value, QObject *parent = nullptr)
QPieSlice *slice0 =new QPieSlice("hlf",11);
QPieSlice *slice1 =new QPieSlice("sun",12);
QPieSlice *slice2 =new QPieSlice("zheng",15);
  1. 创建QPieSeries 对象,添加切片对象QPieSlice
//QPieSeries(QObject *parent = nullptr)
QPieSeries *series= new QPieSeires();

//bool append(QPieSlice *slice)
series->append(slice0);
series->append(slice1);
series->append(slice2);
  1. 创建QChart对象,添加Series
//QChart::QChart(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags())
//void QChart::addSeries(QAbstractSeries *series)
QChart *chart= new QChart();
chart->addSeries(series);
  1. 创建QChartView对象,设定Chart对象
QChartView chartviewPie= new QChartView();
QChartView chartviewPie->setChart(chart);
  1. 把QchartView添加到界面的一个Widget对象
//void QWidget::setParent(QWidget *parent, Qt::WindowFlags f)
chartviewPie->setParent(ui->pieChartView);
	pieChartView是界面上定义的一个QWidget组件

四、饼图属性的修改

比较形象的测试可以参考Qt Chart的示例piechartcustomization
在这里插入图片描述
在这里插入图片描述

4.1 Chart 整体属性

  • animationDuration : int 动画时间间隔

  • animationEasingCurve : QEasingCurve 加速度模式
    – 创建函数:QEasingCurve(QEasingCurve::Type type = Linear)
    – 枚举类型有:enum Type { Linear, InQuad, OutQuad, InOutQuad, …, Custom }

  • animationOptions : QChart::AnimationOptions 动画类型
    – QChart::NoAnimation 0x0 默认值
    – QChart::GridAxisAnimations 0x1 格栅动画
    – QChart::SeriesAnimations 0x2 切片动画
    – QChart::AllAnimations 0x3 所有动画 具体区别自己尝试

  • backgroundRoundness : qreal 背景圆环的直径

  • backgroundVisible : bool 背景可见选项 还有背景圆的刷子颜色等。

  • chartType : const QChart::ChartType chart类型
    – QChart::ChartTypeUndefined 0 无定义
    – QChart::ChartTypeCartesian 1 卡迪尔坐标系
    – QChart::ChartTypePolar 2 极坐标系

  • dropShadowEnabled : bool 阴影选项

  • locale : QLocale 本地化设置

  • localizeNumbers : bool 本地化设置选项

  • margins : QMargins 绘图需与到绘图方框的距离

  • plotArea : QRectF 绘图所属的方框

  • plotAreaBackgroundVisible : bool 绘图区域背景可见

  • theme : QChart::ChartTheme 绘画风格主题,风格主题的选择如下:
    – QChart::ChartThemeLight 0
    – QChart::ChartThemeBlueCerulean 1
    – QChart::ChartThemeDark 2
    – QChart::ChartThemeBrownSand 3
    – QChart::ChartThemeBlueNcs 4
    – QChart::ChartThemeHighContrast 5
    – QChart::ChartThemeBlueIcy 6
    – QChart::ChartThemeQt 7

  • title : QString 绘画的标题

4.2 QPieSeries数据对象的属性

  • count : const int 切片的数量 小于1的浮点数
  • endAngle : qreal ;终止角度
  • holeSize : qreal 中间圆环大小 小于1的浮点数
  • horizontalPosition : qreal 水平位置 小于1的浮点数
  • size : qreal 饼图的尺寸 小于1的浮点数
  • startAngle : qreal 开始角度
  • sum : const qreal 切片的数值总和
  • verticalPosition : qreal 垂直位置 小于1的浮点数

4.3 QPieSlice 切片相关属性

  • angleSpan : const qreal 计算得到的切片角度
  • borderColor : QColor 边框颜色
  • borderWidth : int 边框宽度
  • brush : QBrush 切片的颜色
  • color : QColor 切片颜色
  • explodeDistanceFactor : qreal 爆炸效果距离
  • exploded: bool 爆炸效果选项
  • label : QString 切片标识
  • labelArmLengthFactor : qreal 标签外部显示时线条长度
  • labelBrush :QBrush 标签颜色
  • labelColor : QColor 标签颜色
  • labelFont : QFont 标签字体
  • labelPosition :LabelPosition 标签位置
  • labelVisible : bool 标签显示选项
  • pen : QPen
  • percentage : const qreal 计算所的切片占比
  • startAngle : const qreal 切片起始角度
  • value : qreal 切片的数值

<think>我们将使用PyQt5中的QPieSeries来绘制。首先,需要安装PyQt5和PyQtChart库(如果尚未安装): 安装命令:pip install PyQt5 PyQtChart 步骤: 1. 导入必要的模块。 2. 创建一个QApplication实例。 3. 创建一个QChartView用于显示表。 4. 创建QChart并设置标题。 5. 创建QPieSeries,并添加数据(切片)。 6. 将系列添加到表中。 7. 设置表在视中的位置,并调整视大小。 8. 显示窗口。 下面是一个简单的示例代码,展示如何使用QPieSeries绘制。</think>### PyQt5中QPieSeries绘制详解 在PyQt5中,`QPieSeries`是用于绘制的类,属于`QtCharts`模块。以下是完整的实现代码和详细解释: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtChart import QChart, QChartView, QPieSeries, QPieSlice from PyQt5.QtGui import QPainter, QColor from PyQt5.QtCore import Qt class PieChartWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("PyQt5 示例") self.setGeometry(100, 100, 800, 600) # 窗口位置和大小 # 1. 创建系列 series = QPieSeries() series.setHoleSize(0.35) # 设置空心大小(0-1) # 2. 添加数据切片 data = [ ("苹果", 30, QColor(255, 99, 71)), # 番茄红 ("香蕉", 25, QColor(255, 215, 0)), # 金色 ("橙子", 20, QColor(255, 165, 0)), # 橙色 ("葡萄", 15, QColor(147, 112, 219)), # 紫罗兰 ("其他", 10, QColor(169, 169, 169)) # 灰色 ] for name, value, color in data: slice_ = QPieSlice(name, value) slice_.setColor(color) slice_.setLabelVisible(True) # 显示标签 slice_.setLabelPosition(QPieSlice.LabelOutside) # 标签在外部 slice_.setLabel(f"{name}: {value}%") series.append(slice_) # 3. 设置突出显示效果 series.slices()[0].setExploded(True) # 第一块突出 series.slices()[0].setExplodeDistanceFactor(0.1) # 突出距离 # 4. 创建表并添加系列 chart = QChart() chart.addSeries(series) chart.setTitle("水果销售占比") chart.setAnimationOptions(QChart.SeriesAnimations) # 启用动画 # 5. 创建表视 chart_view = QChartView(chart) chart_view.setRenderHint(QPainter.Antialiasing) # 抗锯齿 self.setCentralWidget(chart_view) if __name__ == "__main__": app = QApplication(sys.argv) window = PieChartWindow() window.show() sys.exit(app.exec_()) ``` ### 代码详细解释: 1. **创建系列**: ```python series = QPieSeries() series.setHoleSize(0.35) # 设置空心大小(0=实心,1=完全空心) ``` 2. **添加数据切片**: - 每个切片包含名称、数值和颜色 - `setLabelVisible(True)`:显示百分比标签 - `setLabelPosition()`:控制标签位置(`LabelOutside`外部/`LabelInside`内部) 3. **突出显示效果**: ```python series.slices()[0].setExploded(True) # 突出显示第一块 series.slices()[0].setExplodeDistanceFactor(0.1) # 突出距离系数 ``` 4. **表设置**: - `chart.setAnimationOptions(QChart.SeriesAnimations)`:启用加载动画 - `chart.setTitle()`:设置表标题 5. **渲染优化**: ```python chart_view.setRenderHint(QPainter.Antialiasing) # 开启抗锯齿使边缘平滑 ``` ### 关键特性说明: 1. **标签定制**: - 使用`slice.setLabelFormat()`自定义标签格式(支持HTML) - 示例:`slice.setLabel("<b>{label}</b>: {value}%")` 2. **事件交互**: ```python def handle_slice_clicked(slice): slice.setExploded(not slice.isExploded()) series.slices()[0].clicked.connect(handle_slice_clicked) ``` 3. **环形**: ```python series.setHoleSize(0.5) # 值越大环越宽 ``` 4. **3D效果**: ```python series.setPieSize(0.7) # 控制大小 series.setVerticalPosition(0.2) # 垂直位置偏移 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值