Qt控件:QChart使用

1. QChart简介

1.1 图标类型

QtCharts 可以绘制以下类型的图表:

  1. 折线图(Line Chart):用于显示数据的趋势和变化,通过连接数据点形成折线。
    在这里插入图片描述

  2. 散点图(Scatter Chart):用于展示数据点的分布情况,每个数据点在坐标系中独立显示。
    在这里插入图片描述

  3. 柱状图(Bar Chart):用于比较多个类别或数据组之间的数值差异,使用矩形柱子表示。
    在这里插入图片描述

  4. 条形图(Horizontal Bar Chart):类似于柱状图,但是柱子是横向排列的。
    在这里插入图片描述

  5. 饼图(Pie Chart):用于展示数据占比情况,通过扇形的大小表示不同数据的相对比例。
    在这里插入图片描述

  6. 区域图(Area Chart):用于显示数据的累积变化情况,通过填充区域来表达数据的范围。
    在这里插入图片描述

  7. 股票图(Stock Chart):用于展示股票市场的价格数据,包括开盘价、收盘价、最高价、最低价等。
    在这里插入图片描述

  8. 散点线图(Spline Chart):类似于散点图,但是通过平滑的曲线连接数据点,更加强调数据的变化趋势。

  9. 曲线图(Spline Series Chart):用于平滑地显示数据的变化情况,通过插值算法计算平滑曲线。
    在这里插入图片描述

  10. 雷达图(Radar Chart):用于展示多个数据维度之间的相对关系,通过多边形的面积来表示数据的相对大小。
    在这里插入图片描述

1.2 相关类

  1. QChartView
    视图组件(画布),无法单独进行显示,需要依附其他组件进行显示,如在窗口设计界面先放置一个QGraphicsView组件,然后升级为QChartView;随后QChartView通过setChart将QChart添加为显示的图表。

  2. QChart
    代表一个图表对象,可以包含一个或多个QAbstractSeries(系列)对象。它提供了管理和控制图表的方法,如添加/移除系列、设置图表标题、轴标签等。

  3. QAbstractSeries
    是所有系列类的基类,代表图表中的一个系列。派生类包括QLineSeries(线性系列)、QScatterSeries(散点系列)、QBarSeries(柱状系列)等。每个系列可以包含一个或多个数据点,并且可以设置系列的样式、颜色、图例等属性。

  4. QLineSeries
    行序列,数据的表现形式,也就是我们要显示的数据,例如折线图。一般是通过QChart的addSeries将QLineSeries添加到图表中,当然不止QLineSeries,还有其他很多类型。

  5. QValueAxis
    坐标轴。具体使用步骤为:①使用QChart的addAxis将坐标轴添加到图表上;②使用QLineSeries的attachAxis设置数据与坐标轴的关系;注意这两步设置有先后关系,必须先将坐标轴添加到QChart,如果顺序反了会提示没有与之关联的坐标轴。

  6. QScatterSeries
    代表图表中的散点系列,用于绘制散点图。可以通过添加数据点来构建散点系列,也可以设置散点的样式和颜色。

  7. QBarSeries
    代表图表中的柱状系列,用于绘制柱状图。可以通过添加数据点来构建柱状系列,也可以设置柱子的样式和颜色。

  8. QAbstractAxis
    是所有轴类的基类,代表图表中的一个轴。派生类包括QValueAxis(数值轴)和QCategoryAxis(分类轴)。每个轴可以设置轴范围、刻度间隔、标签等属性。

  9. QCategoryAxis:代表图表中的分类轴,用于显示离散的类别。可以设置轴的类别列表、标签格式等属性。

1.2 QChart创建步骤

QChart创建的一般步骤为:

  1. 创建QChartView画布
  2. 创建QChart图表
  3. 创建QValueAxis坐标轴(部分图表不用,例如:饼状图)
  4. 创建序列
  5. 配置序列(坐标轴)、设置序列(坐标轴)参数、添加数据等
  6. 将序列加入图表
  7. 将坐标轴加入图表
  8. 关联xy轴(部分图表不用,例如:饼状图),将图表和自己创建的xy轴关联
  9. 将图表QChart加入QChartView画布中

2. 创建画布(添加QChartView控件)

  1. 首先在项目配置文件添加 charts 模块 Qt += charts(此为在Qt Creater中编程)
    如果在VS中编程需要进行配置:
    首先打开项目的属性,注意在添加包含目录的时候,要把QtCharts那个路径添加进去,这样ui文件中提升的那个头文件就不会报错
    VC++目录->包含目录->添加:
    D:\Qt\5.15.2\msvc2019_64\include\QtCharts
    D:\Qt\5.15.2\msvc2019_64\include
    库目录:
    D:\Qt\5.15.2\msvc2019_64\lib
    下面添加附加依赖库:连接器->输入->添加依赖项:Qt5Chartsd.lib;Qt5Charts.lib

    我们在添加命名空间的时候不要在ui_xxx.h文件里面进行添加,因为这是自动生成的文件,每一次添加新的控件并编译的时候就把你添加的信息给删除掉,这时我们可以添加到刚开始新建的文件中去,见下图;添加头文件和命名空间需要加在#include "ui_QtChartClass.h"之前,因为该文件中也需要用到
    在这里插入图片描述

  2. 打开设计界面,将 Widget 容器(Graphics View控件),拖动到界面上,鼠标右击 Widget 容器,选择提升的窗口部件,选择基类名称 QWidget,提示的类名称 输入QChartView, 点击添加。
    在这里插入图片描述
    在这里插入图片描述

  3. 选中QChartView,点击提升,此时原QWidget控件就会变为QCharView控件。
    在这里插入图片描述

  4. 在项目头文件中中导入QtCharts #include
    在这里插入图片描述

//创建QChart对象
QChart *chart = new QChart;

//将图表加入画布中
ui.chartView->setChart(chart);

3. 创建图表(QChart类)

类别函数说明
图表外观void setTitle()设置图表标题,显示在图表上方,支持HTML格式
图表外观void setTitleFont()设置图表标题字体
图表外观void setTitleBrush()设置图表标题画刷
图表外观void setTheme()设置主题,主题是内置的UI设置,定义了图表的配色
图表外观void setMargins()设置绘图区与图表边界的4个边距
图表外观QLegend* legend()返回图表的图例,是一个QLegend类的对象
图表外观void setAnimationOptions()设置序列或坐标轴的动画效果
数据序列void addSeries()添加序列
数据序列QList<QAbstractSeries*>series()返回图表拥有的序列的列表
数据序列void removeSeries()移除一个序列,但并不删除序列对象
数据序列void removeAllSeries()移除并删除图表的所有序列
坐标轴void addAxis()为图表的某个反向添加坐标轴
坐标轴QList<QAbstractAxis *>axes()返回某个方向的坐标轴列表
坐标轴void setAxisX()设置某个序列的水平方向的坐标轴
坐标轴void setAxisY()设置某个序列的垂直方向的坐标轴
坐标轴void rmoveAxis()移除一个坐标轴
坐标轴void createDefaultAxes()根据已添加的序列的类型,创建缺省的坐标轴,前面已有的坐标轴会被删除

void setAnimationOptions(AnimationOptions options)函数设置图表的动画效果,输入参数是QChart::AnimationOption枚举类型,有以下几种类型:

  1. QChart::NoAnimation,无动画效果
  2. QChart::GridAxisAnimation,背景网格有动画效果
  3. QChart::SeriesAnimation,序列有动画效果
  4. QChart::AllAnimation,都有动画效果
//创建图表
QChart *chart = new QChart;

4. 创建QValueAxis坐标轴

4.1 QValueAxis类

类别函数说明
坐标轴整体void setVisible()设置坐标轴可见性
坐标轴整体Qt::Orientation orientation()返回坐标轴方向
坐标轴整体void setMin()设置坐标轴最小值
坐标轴整体void setMax()设置坐标轴最大值
坐标轴整体void setRange()设置坐标轴最小、最大值表示的范围
轴标题void setTitleVisible()设置轴标题的可见性
轴标题void setTitleText() 设置轴标题的文字
轴标题void setTitleFont() 设置轴标题的字体
轴标题void setTitleBrush() 设置轴标题的画刷
轴标签void setLabelFormat()设置标签格式,例如可以设置显示的小数点位数
轴标签void setLabelsAngle()设置标签的角度,单位为度
轴标签void setLabelsBrush()设置标签的画刷
轴标签void setLabelsColor()设置标签文字颜色
轴标签void setLabelsFont()设置标签文字字体
轴标签void setLabelsVisible()设置轴标签文字是否可见
轴线和刻度线void setTickCount()设置坐标轴主刻度个数
轴线和刻度线void setLineVisible()设置轴线和刻度线的可见性
轴线和刻度线void setLinePen()设置轴线和刻度线的画笔
轴线和刻度线void setLinePenColor()设置轴线和刻度线的颜色
主刻度线void setGridLineColor()设置网格线的颜色
主刻度线void setGridLinePen()设置网格线的画笔
主刻度线void setGridLineVisible()设置网格线的可见性
次刻度和次网格线void setMinorTickCount()设置两个主刻度之间的次刻度的个数
次刻度和次网格线void setMinorGridLineColor()设置次网格线的颜色
次刻度和次网格线void setMinorGridLinePen()设置次网格线的画笔
次刻度和次网格线void setMinorGridLineVisible()设置次网格线的可见性

4.2 创建

使用addAxis方式(可以设置坐标轴位置)

//1.创建画布
 
//2.创建图表
chart = new QChart;
//3.创建xy坐标
axisX = new QValueAxis;
axisY = new QValueAxis;
//4.设置坐标范围
axisX->setRange(-10,10);
axisY->setRange(-10,10);
//5.将坐标加入图表,并设置坐标位置
chart->addAxis(axisX,Qt::AlignBottom);
chart->addAxis(axisY,Qt::AlignLeft);
//6.将序列加入图表
 
//7.关联xy轴,将序列加入自己的xy坐标(attachAxis)
 
//8.将图表加入画布
ui->chartView->setChart(chart);

使用setAxisX、setAxisY方式(不可以设置坐标轴位置)

//1.创建画布(已用ui设置)
 
//2.创建图表
chart = new QChart;
//3.创建xy坐标
axisX = new QValueAxis;
axisY = new QValueAxis;
//4.设置坐标范围
axisX->setRange(-10,10);
axisY->setRange(-10,10);
//5.将坐标加入图表,关联xy轴(将序列图表放在自己创建的坐标系上)
chart->setAxisX(axisX);
chart->setAxisY(axisY);
//6.将序列加入图表
 
//7.将图表加入画布
ui->chartView->setChart(chart);

总体而言,使用addAxis()方法可以在图表中添加多个轴,并且可以更灵活地管理不同的轴。而使用setAxisX()和setAxisY()方法则适用于只需要一个X轴和一个Y轴的简单情况,并且可以自动关联系列和轴。选择使用哪种方式取决于你的需求和使用场景。

5. 创建序列

5.1 散点图

函数说明
append(double x, double y)向散点图中添加一个点
replace(int index, double x, double y)替换指定索引位置的点的坐标。
setMarkerShape(QScatterSeries::MarkerShape shape)设置散点的形状。
setMarkerSize(qreal size)设置散点的大小。
setBorderColor(QColor color)设置散点的边框颜色。
setBrush(QColor color)设置散点的填充颜色。
setColor(QColor color)设置散点的颜色,包括边框和填充。
clear()清空散点图中的所有点。
void QtChartClass::drawScatterPlot()
{
	// 绘制散点图
	//初始化坐标轴
	//create_coordinate_system();

	//创建图表
	QChart* chart = new QChart;
	chart->setTitle(u8"chart绘制");

	QValueAxis *MyAxisX = new QValueAxis;         // X轴
	QValueAxis *MyAxisY = new QValueAxis;         // Y轴

	//自定义创建散点
	QScatterSeries* scatterSeries = new QScatterSeries;
	scatterSeries->setName(u8"散点");
	scatterSeries->setMarkerSize(7);
	scatterSeries->setMarkerShape(QScatterSeries::MarkerShapeCircle);//设置散点形状为圆
	scatterSeries->append(1, 1);
	//随机散点
	for (int i = -60; i < 60; i++)// 添加120个任意点
	{
		scatterSeries->append(i, QRandomGenerator::global()->bounded(-60, 60));
	}

	//将散点加入图表中
	chart->addSeries(scatterSeries);

	//将散点的图表放在自己创建的坐标系上
	chart->setAxisX(MyAxisX, scatterSeries);
	chart->setAxisY(MyAxisY, scatterSeries);

	//将图表加入画布中
	ui.chartView->setChart(chart);
}

在这里插入图片描述

5.2 折线图

API介绍

函数说明
void setName()设置序列的名称,这个名称会显示在图例里,支持HTML格式
————————————————
QChart *chart()返回序列所属的图表对象
void setVisible()设置序列的可见性
void show()显示序列,使序列可见
void hide()隐藏序列,使其不可见
void setColor()设置序列线条的颜色
void setPen()设置序列线条的画笔
void setBrush()设置绘制数据点的画刷
void setOpacity()设置序列的透明度,0表示完全透明,1表示不透明
————————————————
void setPointsVisible()设置数据点的可见性
void append()添加一个数据点到序列
void insert()在某个位置插入一个数据点
void replace()替换某个数据点
void clear()清空所有数据点
void remove()删除某个数据点
void removePoints()从某个位置开始,删除指定个数的数据点
int count()数据点的个数
QPointF& at()返回某个位置的数据点
QList points()返回数据点的列表
QVector pointsVector()返回数据点的,效率更高
————————————————
void setPointLabelsVisible()设置数据点标签的可见性
void setPointLabelsColor()设置数据点标签的文字颜色
void setPointLabelsFont()设置数据点标签字体
void setPointLabelsFormat()设置数据点标签格式
void setPointLabelsClipping()设置标签的裁剪属性,默认为true,即绘图区外的标签被裁剪掉
————————————————
bool attachAxis()为序列附加一个坐标轴,通常需要一个X轴和Y轴
bool detachAxis()解除一个附加的坐标轴
QList<QAbstractAxis *>attachedAxes()返回附加的坐标轴的列表

实例操作

绘制两条折现在图表中:

  1. 创建画布
  2. 创建QChart类
  3. 创建数据序列,并加入QChart类对象
  4. 创建坐标系,并加入QChart类对象,然后关联序列和坐标系
  5. 将图表放入画布中
void QtChartClass::drawLinePlot()
{
	// 绘制折线图
	//初始化坐标轴

	//创建图表
	QChart* chart = new QChart;

	//创建线条并加入图表
	QLineSeries* lineSeries1 = new QLineSeries;
	lineSeries1->setName(u8"正弦曲线");
	int i;//sin的步长,横坐标
	for (i = -60; i < 61; i++) {
		qreal j = qSin(i);
		lineSeries1->append(i, j);
	}
	chart->addSeries(lineSeries1);
	QLineSeries* lineSeries2 = new QLineSeries;
	lineSeries2->setName(u8"折线");
	// 添加折线数据
	for (int i = 0; i <= 20; i++) {
		qreal x = i;
		qreal y = QRandomGenerator::global()->bounded(-20, 20);
		lineSeries2->append(x, y);
	}
	chart->addSeries(lineSeries2);

	//创建坐标系并加入图表
	QValueAxis* MyAxisX = new QValueAxis;         // X轴
	MyAxisX->setTitleText(u8"x轴");
	MyAxisX->setRange(-60, 60);
	chart->addAxis(MyAxisX, Qt::AlignBottom);
	//关联序列和坐标轴
	lineSeries1->attachAxis(MyAxisX);
	lineSeries2->attachAxis(MyAxisX);
	QValueAxis* MyAxisY = new QValueAxis;         // Y轴
	MyAxisY->setTitleText(u8"y轴");
	MyAxisY->setRange(-20, 20);
	chart->addAxis(MyAxisY, Qt::AlignLeft);
	//关联序列和坐标轴
	lineSeries1->attachAxis(MyAxisY);
	lineSeries2->attachAxis(MyAxisY);

	//将图表加入画布中
	ui.chartView->setChart(chart);
}

在这里插入图片描述

5.3 柱状图

API

函数说明
void setLabel()设置数据集的标签,用于图例的显示文字
void setLabelBrush()设置标签的画刷
void setLabelColor()设置标签的文字颜色
void setLabelFont()设置标签的字体
void setBorderColor()设置数据集的棒图的边框颜色
void setBrush()设置数据集的棒图的画刷
void setColor()设置数据集的棒图填充颜色
void setPen()设置数据集的棒图的边框画笔
void append()添加一个数据到数据集
void insert()在某个位置插入一个数据到数据集
void remove()从某个位置开始删除一定数量的数据
void replace()替换某个位置的数据
qreal at()返回某个位置的数据
int count()返回数据的个数
qreal sum()返回数据集内所有数据的和

实例操作

void QtChartClass::drawBoxPlot()
{
	//绘制柱状图
	//创建图表
	QChart* chart = new QChart;

	//创建QBarSeries,条形图容器,用于管理和显示多条柱子
	QBarSeries* barSeries = new QBarSeries;
	//barSeries->setBarWidth(5);//设置数据棒的宽度

	//创建QBarSet并添加数据
	QBarSet* set1 = new QBarSet("data1");
	QBarSet* set2 = new QBarSet("data2");
	QBarSet* set3 = new QBarSet("data3");
	QBarSet* set4 = new QBarSet("data4");

	*set1 << QRandomGenerator::global()->bounded(0, 61)
		<< QRandomGenerator::global()->bounded(0, 61)
		<< QRandomGenerator::global()->bounded(0, 61)
		<< QRandomGenerator::global()->bounded(0, 61);

	*set2 << QRandomGenerator::global()->bounded(0, 61)
		<< QRandomGenerator::global()->bounded(0, 61)
		<< QRandomGenerator::global()->bounded(0, 61)
		<< QRandomGenerator::global()->bounded(0, 61);

	*set3 << QRandomGenerator::global()->bounded(0, 61)
		<< QRandomGenerator::global()->bounded(0, 61)
		<< QRandomGenerator::global()->bounded(0, 61)
		<< QRandomGenerator::global()->bounded(0, 61);

	*set4 << QRandomGenerator::global()->bounded(-60, 1)
		<< QRandomGenerator::global()->bounded(-60, 1)
		<< QRandomGenerator::global()->bounded(-60, 1)
		<< QRandomGenerator::global()->bounded(-60, 1);

	//将QBarSet添加到QBarSeries中
	barSeries->append(set1);
	barSeries->append(set2);
	barSeries->append(set3);
	barSeries->append(set4);

	//将QBarSeries添加到图表中
	chart->addSeries(barSeries);

	//用于横坐标的字符串列表
	QStringList categories;
	categories << u8"学生1" << u8"学生2" << u8"学生3" << u8"学生4";

	//用于柱状图的横坐标
	QBarCategoryAxis* axisX = new QBarCategoryAxis;
	axisX->append(categories);
	axisX->setRange(categories[0], categories[categories.length() - 1]);
	QValueAxis* MyAxisY = new QValueAxis;         // Y轴
	MyAxisY->setTitleText(u8"成绩");

	//将散点的图表放在自定义坐标中
	chart->setAxisX(axisX, barSeries);  //等同于addAxis()和attachAxis()函数
	chart->setAxisY(MyAxisY, barSeries);

	//将图表加入画布中
	ui.chartView->setChart(chart);
}

在这里插入图片描述

void QtChartClass::drawBarPlot()
{
	// 绘制堆叠柱状图
	//创建图表
	QChart* chart = new QChart;

	//创建QStackedBarSeries,堆柱状图
	QStackedBarSeries* series = new QStackedBarSeries;
	//创建QBarSet并添加数据
	QBarSet* set1 = new QBarSet("data1");
	QBarSet* set2 = new QBarSet("data2");
	QBarSet* set3 = new QBarSet("data3");
	*set1 << QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100);

	*set2 << QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100);

	*set3 << QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100);
	//将QBarSet添加到QBarSeries中
	series->append(set1);
	series->append(set2);
	series->append(set3);
	series->setLabelsVisible(true);
	//将QBarSeries添加到图表中
	chart->addSeries(series);

	//用于横坐标的字符串列表
	QStringList categories;
	categories << u8"学生1" << u8"学生2" << u8"学生3" << u8"学生4";

	//用于柱状图的横坐标
	QBarCategoryAxis* axisX = new QBarCategoryAxis;
	axisX->append(categories);
	axisX->setRange(categories[0], categories[categories.length() - 1]);

	//数值型坐标作为纵坐标
	QValueAxis* axisY = new QValueAxis;
	axisY->setRange(0, 300);
	axisY->setTitleText(u8"分数");
	axisY->setTickCount(11);
	axisY->setMinorTickCount(10);
	axisY->setLabelFormat("%d");
	//将散点的图表放在自定义坐标中
	chart->setAxisX(axisX, series);
	chart->setAxisY(axisY, series);

	//将图表加入画布中
	ui.chartView->setChart(chart);
}

在这里插入图片描述

void QtChartClass::drawPrecBarPlot()
{
	// 绘制百分比柱状图
	//创建图表
	QChart* chart = new QChart;

	//创建QPercentBarSeries,百分比柱状图
	QPercentBarSeries* series = new QPercentBarSeries;
	//创建QBarSet并添加数据
	QBarSet* set1 = new QBarSet("data1");
	QBarSet* set2 = new QBarSet("data2");
	QBarSet* set3 = new QBarSet("data3");
	*set1 << QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100);
	*set2 << QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100);
	*set3 << QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100)
		<< QRandomGenerator::global()->bounded(0, 100);
	//将QBarSet添加到QBarSeries中
	series->append(set1);
	series->append(set2);
	series->append(set3);
	series->setLabelsVisible(true);
	//将QBarSeries添加到图表中
	chart->addSeries(series);

	//用于横坐标的字符串列表
	QStringList categories;
	categories << u8"学生1" << u8"学生2" << u8"学生3" << u8"学生4";
	//用于柱状图的横坐标
	QBarCategoryAxis* axisX = new QBarCategoryAxis;
	axisX->append(categories);
	axisX->setRange(categories[0], categories[categories.length() - 1]);
	//数值型坐标作为纵坐标
	QValueAxis* axisY = new QValueAxis;
	axisY->setRange(0, 100);
	axisY->setTitleText(u8"百分比");
	axisY->setTickCount(6);
	axisY->setMinorTickCount(10);
	axisY->setLabelFormat("%d");

	//将散点的图表放在自定义坐标中
	chart->setAxisX(axisX, series);
	chart->setAxisY(axisY, series);

	//将图表加入画布中
	ui.chartView->setChart(chart);

}

在这里插入图片描述

5.4 饼状图

API简介

函数说明
bool append()添加一个分块到饼图
bool insert()在某个位置插入一个分块
bool remove()移除并删除一个分块
bool take()移除一个分块,但并不删除数据块对象
void clear()清除序列所有分块
QList<QPieSlice *>slices()返回序列的所有分块的列表
int count()返回序列分块的个数
bool isEmpty()如果序列为空,返回true,否则返回false
qreal sum()返回序列各分块的数值的和
void setHoleSize()设置饼图中心的空心圆大小,在0~1之间
void setPieSize()设置饼图占图表矩形区的相对大小,0是最小,1最大
void setLabelsVisible()设置分块的标签的可见性

操作实例

在这里插入图片描述

void QtChartClass::drawPiePlot()
{
	// 绘制饼图
	//创建图表
	QChart* chart = new QChart;

	//创建饼状图序列
	QPieSeries* pieSeries = new QPieSeries;

	//设置饼状图数据
	pieSeries->append("data1", 7);
	pieSeries->append("data2", 4);
	pieSeries->append("data3", 9);
	pieSeries->append("data4", 3);
	pieSeries->append("data5", 6);

	QPieSlice* slice = pieSeries->slices().at(0);
	slice->setExploded(true);//设置exploded动画效果

	pieSeries->setLabelsVisible(true);//设置饼图划分的提示

	//将饼状图加入图表
	chart->addSeries(pieSeries);

	//将图表加入画布
	ui.chartView->setRenderHint(QPainter::Antialiasing); // 抗锯齿
	ui.chartView->setChart(chart);
}

5.5 极坐标

函数说明
addSeries(QAbstractSeries *series)向极坐标图表中添加一个数据系列。
removeSeries(QAbstractSeries *series)从极坐标图表中移除指定的数据系列。
setBackgroundVisible(bool visible)设置是否显示极坐标图表的背景。
setAxisX(QValueAxis *axis)设置极坐标图表的 X 轴。
setAxisY(QValueAxis *axis)设置极坐标图表的 Y 轴。
setAngularOrientation(Qt::Orientation orientation)设置极坐标图表的角度方向。
setRadialOrientation(Qt::Orientation orientation)设置极坐标图表的径向方向。
void QtChartClass::drawPolarPlot()
{
	// 绘制极坐标
	QScatterSeries* series = new QScatterSeries();     // 创建一个散点绘图数据集对象
	const qreal angularMax = 100;    // 最大角度
	series->setName(u8"散点");
	for (int i = 0; i < angularMax; i += 10)
	{
		series->append(i, i + 100);                   // 向series中添加数据,X:角度 Y:到圆心距离
	}

	QPolarChart* chart = new QPolarChart();           // 创建一个极坐标系图表
	chart->legend()->setVisible(true);               // 显示图例
	chart->addSeries(series);                         // 将创建的series添加进图表中
	chart->createDefaultAxes();                       // 根据已有的series生成默认的坐标轴
	ui.chartView->setChart(chart);
}

在这里插入图片描述

6. 动态曲线

采用定时器来添加序列数据和设置坐标轴的范围,从而实现动态曲线
Note:定时器最好不要反复开关,不然会发生变快的现象。定时器变快解决方案
在这里插入图片描述

void QtChartClass::drawDynamicPlot()
{
	// 绘制动态曲线
	static int count;

	// 点击按钮启动或者关闭定时器, 定时器启动, 周期性得到当前时间
	// 启动定时器
	if (timer->isActive()) {
		timer->stop();
		count = 0;
		lineSeries->clear();
		splineSeries->clear();
		ui.dynamicBtn->setText(u8"绘制动态曲线");
	}
	else
	{
		timer->stop();
		timer->start();
		timer->setInterval(500);
		ui.dynamicBtn->setText(u8"结束绘制曲线");
	};

	// 修改定时器对象的精度
	timer->setTimerType(Qt::CoarseTimer);

	//绘制曲线
	//创建图表
	chart = new QChart;

	lineSeries = new QLineSeries;
	lineSeries->setName(u8"QLineSeries不平滑曲线");
	splineSeries = new QSplineSeries;
	splineSeries->setName(u8"QSplineSeries平滑曲线");

	chart->addSeries(lineSeries);
	chart->addSeries(splineSeries);

	//创建坐标轴
	axisX = new QValueAxis();
	axisY = new QValueAxis();
	axisY->setRange(-10, 10);
	axisX->setRange(0, 30);
	chart->addAxis(axisX, Qt::AlignBottom);
	chart->addAxis(axisY, Qt::AlignLeft);

	//将序列绑定在自己的坐标轴上
	lineSeries->attachAxis(axisX);
	lineSeries->attachAxis(axisY);
	splineSeries->attachAxis(axisX);
	splineSeries->attachAxis(axisY);

	//画布与图表结合
	ui.chartView->setChart(chart);

	// 按钮 timeBtn 的点击事件
	connect(timer, &QTimer::timeout, this, [=]()
	{
		qreal j = qSin(count);
		qreal k = qCos(count);
		lineSeries->append(count, j);
		splineSeries->append(count, k);
		int points = splineSeries->points().size();;
		QString tmstr = QString::number(count);
		qDebug() << tmstr;
		if (points >= 30) {
			axisX->setMax(count);
			axisX->setMin(count - 30);
			count = count + 1;
		}
		else {
			count = count + 1;
		}
	});
}

7. 图表的放大、缩小、平移和还原

需要从QChartView派生自定义控件类,然后将空间窗口提升为自定义的图表类,在自定义的类中进行事件的重定义,从而实现图标的放大、缩小、平移以及还原操作。
在这里插入图片描述

7.1 QChartView类

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值