QChart
1. QChart简介
1.1 图标类型
QtCharts 可以绘制以下类型的图表:
-
折线图(Line Chart):用于显示数据的趋势和变化,通过连接数据点形成折线。
-
散点图(Scatter Chart):用于展示数据点的分布情况,每个数据点在坐标系中独立显示。
-
柱状图(Bar Chart):用于比较多个类别或数据组之间的数值差异,使用矩形柱子表示。
-
条形图(Horizontal Bar Chart):类似于柱状图,但是柱子是横向排列的。
-
饼图(Pie Chart):用于展示数据占比情况,通过扇形的大小表示不同数据的相对比例。
-
区域图(Area Chart):用于显示数据的累积变化情况,通过填充区域来表达数据的范围。
-
股票图(Stock Chart):用于展示股票市场的价格数据,包括开盘价、收盘价、最高价、最低价等。
-
散点线图(Spline Chart):类似于散点图,但是通过平滑的曲线连接数据点,更加强调数据的变化趋势。
-
曲线图(Spline Series Chart):用于平滑地显示数据的变化情况,通过插值算法计算平滑曲线。
-
雷达图(Radar Chart):用于展示多个数据维度之间的相对关系,通过多边形的面积来表示数据的相对大小。
1.2 相关类
-
QChartView
视图组件(画布),无法单独进行显示,需要依附其他组件进行显示,如在窗口设计界面先放置一个QGraphicsView组件,然后升级为QChartView;随后QChartView通过setChart将QChart添加为显示的图表。 -
QChart
代表一个图表对象,可以包含一个或多个QAbstractSeries(系列)对象。它提供了管理和控制图表的方法,如添加/移除系列、设置图表标题、轴标签等。 -
QAbstractSeries
是所有系列类的基类,代表图表中的一个系列。派生类包括QLineSeries(线性系列)、QScatterSeries(散点系列)、QBarSeries(柱状系列)等。每个系列可以包含一个或多个数据点,并且可以设置系列的样式、颜色、图例等属性。 -
QLineSeries
行序列,数据的表现形式,也就是我们要显示的数据,例如折线图。一般是通过QChart的addSeries将QLineSeries添加到图表中,当然不止QLineSeries,还有其他很多类型。 -
QValueAxis
坐标轴。具体使用步骤为:①使用QChart的addAxis将坐标轴添加到图表上;②使用QLineSeries的attachAxis设置数据与坐标轴的关系;注意这两步设置有先后关系,必须先将坐标轴添加到QChart,如果顺序反了会提示没有与之关联的坐标轴。 -
QScatterSeries
代表图表中的散点系列,用于绘制散点图。可以通过添加数据点来构建散点系列,也可以设置散点的样式和颜色。 -
QBarSeries
代表图表中的柱状系列,用于绘制柱状图。可以通过添加数据点来构建柱状系列,也可以设置柱子的样式和颜色。 -
QAbstractAxis
是所有轴类的基类,代表图表中的一个轴。派生类包括QValueAxis(数值轴)和QCategoryAxis(分类轴)。每个轴可以设置轴范围、刻度间隔、标签等属性。 -
QCategoryAxis:代表图表中的分类轴,用于显示离散的类别。可以设置轴的类别列表、标签格式等属性。
1.2 QChart创建步骤
QChart创建的一般步骤为:
- 创建QChartView画布
- 创建QChart图表
- 创建QValueAxis坐标轴(部分图表不用,例如:饼状图)
- 创建序列
- 配置序列(坐标轴)、设置序列(坐标轴)参数、添加数据等
- 将序列加入图表
- 将坐标轴加入图表
- 关联xy轴(部分图表不用,例如:饼状图),将图表和自己创建的xy轴关联
- 将图表QChart加入QChartView画布中
2. 创建画布(添加QChartView控件)
-
首先在项目配置文件添加 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"之前,因为该文件中也需要用到
-
打开设计界面,将 Widget 容器(Graphics View控件),拖动到界面上,鼠标右击 Widget 容器,选择提升的窗口部件,选择基类名称 QWidget,提示的类名称 输入QChartView, 点击添加。
-
选中QChartView,点击提升,此时原QWidget控件就会变为QCharView控件。
-
在项目头文件中中导入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枚举类型,有以下几种类型:
- QChart::NoAnimation,无动画效果
- QChart::GridAxisAnimation,背景网格有动画效果
- QChart::SeriesAnimation,序列有动画效果
- 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() | 返回附加的坐标轴的列表 |
实例操作
绘制两条折现在图表中:
- 创建画布
- 创建QChart类
- 创建数据序列,并加入QChart类对象
- 创建坐标系,并加入QChart类对象,然后关联序列和坐标系
- 将图表放入画布中
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类