Qt之QChart使用
一、相关类的介绍
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
代表图表中的分类轴,用于显示离散的类别。可以设置轴的类别列表、标签格式等属性。
二、封装的图表类型
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、打开.pro文件,输入Qt += charts,引入Qt Charts模块;
![]()
2、打开ui设计器,选择一个Graphics View控件,鼠标右键提升为;


3、输入QChartView,点击添加、提升;

4、在窗口右上角就可以看见控件类型变成QChartView了,然后将控件命名为chartView。

5、在代码中添加QtCharts头文件,引入命名空间;

四、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,都有动画效果
五、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() | 设置次网格线的可见性 |
1、第一种方式:使用addAxis方式(可以设置坐标轴位置)
//1.创建画布(已用ui设置)
//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);
2、第二种方式:使用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);
总结:
在Qt的QChart中,可以使用以下两种方式来设置坐标轴:
1、使用addAxis()方法:在这种方式下,轴对象可以在图表中独立于系列添加和移除,因此可以在图表中灵活地管理和控制不同的轴。
2、使用setAxisX()和setAxisY()方法:在这种方式下,每个图表只能有一个X轴和一个Y轴,并且会自动将系列与这些轴关联起来。当添加新的系列时,它们会自动使用已设置的X轴和Y轴。
总体而言,使用addAxis()方法可以在图表中添加多个轴,并且可以更灵活地管理不同的轴。而使用setAxisX()和setAxisY()方法则适用于只需要一个X轴和一个Y轴的简单情况,并且可以自动关联系列和轴。选择使用哪种方式取决于你的需求和使用场景。
六、QChart绘图一般步骤
1、创建QChartView画布
2、创建QChart图表
3、创建序列
4、创建QValueAxis坐标轴(部分图表不用,例如:饼状图)
5、配置序列(坐标轴)、设置序列(坐标轴)参数、添加数据等
6、将序列加入图表
7、将坐标轴加入图表
8、关联xy轴(部分图表不用,例如:饼状图),将图表和自己创建的xy轴关联
9、将图表QChart加入QChartView画布中
七、散点图
| 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() | 清空散点图中的所有点。 |
//初始化坐标轴
create_coordinate_system();
//创建图表
QChart *chart = new QChart;
//自定义创建散点
QScatterSeries *scatterSeries = new QScatterSeries;
scatterSeries->setName("散点");
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(x_axis,scatterSeries);
chart->setAxisY(y_axis,scatterSeries);
//将图表加入画布中
ui->chartView->setChart(chart);
效果图:

八、折线图
| 序列名称 | 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<QPointF> points() | 返回数据点的列表 | |
| QVector<QPointF> pointsVector() | 返回数据点的,效率更高 | |
| 数据点标签 | void setPointLabelsVisible() | 设置数据点标签的可见性 |
| void setPointLabelsColor() | 设置数据点标签的文字颜色 | |
| void setPointLabelsFont() | 设置数据点标签字体 | |
| void setPointLabelsFormat() | 设置数据点标签格式 | |
| void setPointLabelsClipping() | 设置标签的裁剪属性,默认为true,即绘图区外的标签被裁剪掉 | |
| 坐标轴 | bool attachAxis() | 为序列附加一个坐标轴,通常需要一个X轴和Y轴 |
| bool detachAxis() | 解除一个附加的坐标轴 | |
| QList<QAbstractAxis *>attachedAxes() | 返回附加的坐标轴的列表 |
//初始化坐标轴
create_coordinate_system();
//创建图表
QChart *chart = new QChart;
//创建线条
QLineSeries *lineSeries1 = new QLineSeries;
QLineSeries *lineSeries2 = new QLineSeries;
lineSeries1->setName("正弦曲线");
lineSeries2->setName("折线");
int i;//sin的步长,横坐标
for(i=-60;i<61;i++){
qreal j = qSin(i);
lineSeries1->append(i,j);
}
// 添加折线数据
qsrand(QTime::currentTime().second());
for(int i = 0; i <= 20; i++) {
qreal x = i;
qreal y = qrand()%100;
lineSeries2->append(x, y);
}
//将线条加入图表
chart->addSeries(lineSeries1);
chart->addSeries(lineSeries2);
//将有线条的图表加入自己的坐标系中
chart->setAxisX(x_axis,lineSeries1);
chart->setAxisY(y_axis,lineSeries1);
//将图表加入画布中
ui->chartView->setChart(chart);
效果图:

九、柱状图
| 标签 | 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() | 返回数据集内所有数据的和 |
(一)普通柱状图
//初始化坐标轴
create_coordinate_system();
//创建图表
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);
//用于横坐标的字符串列表
QStringList categories;
categories<<"学生1"<<"学生2"<<"学生3"<<"学生4";
//用于柱状图的横坐标
QBarCategoryAxis *axisX = new QBarCategoryAxis;
axisX->append(categories);
axisX->setRange(categories[0],categories[categories.length()-1]);
//将QBarSet添加到QBarSeries中
barSeries->append(set1);
barSeries->append(set2);
barSeries->append(set3);
barSeries->append(set4);
//将QBarSeries添加到图表中
chart->addSeries(barSeries);
//将散点的图表放在自定义坐标中
chart->setAxisX(axisX,barSeries);
chart->setAxisY(y_axis,barSeries);
//将图表加入画布中
ui->chartView->setChart(chart);
效果图:

(二)堆叠柱状图
//创建图表
QChart *chart = new QChart;
//创建QStackedBarSeries,堆柱状图
QStackedBarSeries *series=new QStackedBarSeries;
// barSeries->setBarWidth(5);//设置数据棒的宽度
//创建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);
//用于横坐标的字符串列表
QStringList categories;
categories<<"学生1"<<"学生2"<<"学生3"<<"学生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("分数");
axisY->setTickCount(11);
axisY->setMinorTickCount(10);
axisY->setLabelFormat("%d");
//将QBarSet添加到QBarSeries中
series->append(set1);
series->append(set2);
series->append(set3);
series->setLabelsVisible(true);
//将QBarSeries添加到图表中
chart->addSeries(series);
//将散点的图表放在自定义坐标中
chart->setAxisX(axisX,series);
chart->setAxisY(axisY,series);
//将图表加入画布中
ui->chartView->setChart(chart);
效果图:

(三)百分比柱状图
//创建图表
QChart *chart = new QChart;
//创建QPercentBarSeries,百分比柱状图
QPercentBarSeries *series=new QPercentBarSeries;
// barSeries->setBarWidth(5);//设置数据棒的宽度
//创建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);
//用于横坐标的字符串列表
QStringList categories;
categories<<"学生1"<<"学生2"<<"学生3"<<"学生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("百分比");
axisY->setTickCount(6);
axisY->setMinorTickCount(10);
axisY->setLabelFormat("%d");
//将QBarSet添加到QBarSeries中
series->append(set1);
series->append(set2);
series->append(set3);
series->setLabelsVisible(true);
//将QBarSeries添加到图表中
chart->addSeries(series);
//将散点的图表放在自定义坐标中
chart->setAxisX(axisX,series);
chart->setAxisY(axisY,series);
//将图表加入画布中
ui->chartView->setChart(chart);
效果图:

十、饼状图
| 分块操作 | 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() | 设置分块的标签的可见性 |
//创建图表
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);
效果图:

十一、极坐标(雷达)
| 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) | 设置极坐标图表的径向方向。 |
QScatterSeries* series = new QScatterSeries(); // 创建一个散点绘图数据集对象
const qreal angularMax = 100; // 最大角度
series->setName("散点");
for(int i = 0; i < angularMax; i += 10)
{
series->append(i, i + 100); // 向series中添加数据,X:角度 Y:到圆心距离
}
QPolarChart* chart = new QPolarChart(); // 创建一个极坐标系图表
chart->legend()->setVisible(false); // 隐藏图例
chart->addSeries(series); // 将创建的series添加进图表中
chart->createDefaultAxes(); // 根据已有的series生成默认的坐标轴
ui->chartView->setChart(chart);
效果图:

十二、动态曲线(可缩放、查坐标)
static int count = 0;
// //初始化画布(已用ui)
// chartView = new QChartView(this);
// chartView->setFixedSize(this->window()->width(),this->window()->height());//设置画布大小
chart = new QChart;
QLineSeries *lineSeries = new QLineSeries;
lineSeries->setName("QLineSeries不平滑曲线");
QSplineSeries *splineSeries = new QSplineSeries;
splineSeries->setName("QSplineSeries平滑曲线");
// int i;
// for(i = -10;i<11;i++){
// qreal j = qSin(i);
// qreal k = qCos(i);
// lineSeries->append(i,j);
// splineSeries->append(i,k);
// }
QValueAxis *axisX = new QValueAxis();
QValueAxis *axisY = new QValueAxis();
axisY->setRange(-10,10);
axisX->setRange(0,30);
chart->addSeries(lineSeries);
chart->addSeries(splineSeries);
//加入chart并设置坐标轴位置、方向
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);
ui->chartView->setMouseTracking(true); //开启鼠标追踪功能
QTimer *timer = new QTimer(this);
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();
if(points >= 30){
axisX->setMax(++count);
axisX->setMin(count-30);
}else {
count++;
}
});
timer->start(100);
//=======================================================================================
//槽函数
void Widget::mouseMoveEvent(QMouseEvent *event)
{
// 获取鼠标在QChartView中的坐标(按住鼠标左键显示坐标)
QPointF mousePoint = event->pos();
// 获取鼠标在QChartView中的坐标
QPoint chartPoint = ui->chartView->mapFromGlobal(event->globalPos());
// 将坐标转换为QChart中的数值
QPointF value = ui->chartView->chart()->mapToValue(mousePoint);
// 在这里你可以更新提示框或者标签来显示当前坐标点的数值
updateTooltip(value);
}
void Widget::wheelEvent(QWheelEvent *event)
{
if(event->delta() > 0){ // 当滚轮远离使用者时
chart->zoomIn(); // 进行放大
// Xrang /= 1.5;
}else{ // 当滚轮向使用者方向旋转时
chart->zoomOut(); // 进行缩小
// Xrang *= 1.5;
}
}
十三、设置图表放大、缩小、移动、显示坐标
ChartView.h文件
#pragma once
#include <QChartView>
#include <QMouseEvent>
#include <QDebug>
#include <QGraphicsSimpleTextItem>
QT_CHARTS_USE_NAMESPACE
class ChartView : public QChartView
{
Q_OBJECT
public:
ChartView(QChart *chart, QWidget *parent = nullptr);
~ChartView();
// 保存坐标区域,用于复位
void saveAxisRange();
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void wheelEvent(QWheelEvent *event);
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);
private:
QPoint m_lastPoint;
bool m_isPress;
bool m_ctrlPress;
bool m_alreadySaveRange;
double m_xMin, m_xMax, m_yMin, m_yMax;
QGraphicsSimpleTextItem* m_coordItem;
};
ChartView .cpp文件
#include "ChartView.h"
#include <QApplication>
#include <QValueAxis>
ChartView::ChartView(QChart *chart, QWidget *parent)
: QChartView(chart, parent)
{
m_isPress = false;
m_ctrlPress = false;
m_alreadySaveRange = false;
m_coordItem = nullptr;
this->setDragMode(QGraphicsView::ScrollHandDrag);
this->setMouseTracking(true);
setCursor(QCursor(Qt::PointingHandCursor)); //设置鼠标指针为手指形
}
ChartView::~ChartView()
{
}
void ChartView::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
m_lastPoint = event->pos();
qDebug() << "mousePressEvent:x=" << m_lastPoint.x() << ",y=" << m_lastPoint.y();
m_isPress = true;
}
}
void ChartView::mouseMoveEvent(QMouseEvent *event)
{
if (!m_coordItem)
{
m_coordItem = new QGraphicsSimpleTextItem(this->chart());
m_coordItem->setZValue(5);
m_coordItem->setPos(100, 60);
m_coordItem->show();
}
const QPoint curPos = event->pos();
qDebug() << "mouseMoveEvent:x=" << curPos.x() << ",y=" << curPos.y();
QPointF curVal = this->chart()->mapToValue(QPointF(curPos));
QString coordStr = QString("X = %1, Y = %2").arg(curVal.x()).arg(curVal.y());
m_coordItem->setText(coordStr);
if (m_isPress)
{
QPoint offset = curPos - m_lastPoint;
m_lastPoint = curPos;
if (!m_alreadySaveRange)
{
this->saveAxisRange();
m_alreadySaveRange = true;
}
this->chart()->scroll(-offset.x(), offset.y());
}
}
void ChartView::mouseReleaseEvent(QMouseEvent *event)
{
qDebug() << "======mouseReleaseEvent======";
m_isPress = false;
if (event->button() == Qt::RightButton)
{
if (m_alreadySaveRange)
{
this->chart()->axisX()->setRange(m_xMin, m_xMax);
this->chart()->axisY()->setRange(m_yMin, m_yMax);
}
}
}
void ChartView::wheelEvent(QWheelEvent *event)
{
const QPoint curPos = event->pos();
qDebug() << "wheelEvent:" << curPos.x() << "," << curPos;
QPointF curVal = this->chart()->mapToValue(QPointF(curPos));
if (!m_alreadySaveRange)
{
this->saveAxisRange();
m_alreadySaveRange = true;
}
const double factor = 2;//缩放比例
// if (m_ctrlPress)
// {//Y轴
QValueAxis *axisY = dynamic_cast<QValueAxis*>(this->chart()->axisY());
const double yMin = axisY->min();
const double yMax = axisY->max();
const double yCentral = curVal.y();
double bottomOffset;
double topOffset;
if (event->delta() > 0)
{//放大
bottomOffset = 1.0 / factor * (yCentral - yMin);
topOffset = 1.0 / factor * (yMax - yCentral);
}
else
{//缩小
bottomOffset = 1.0 * factor * (yCentral - yMin);
topOffset = 1.0 * factor * (yMax - yCentral);
}
this->chart()->axisY()->setRange(yCentral - bottomOffset, yCentral + topOffset);
// }
// else
// {//X轴
QValueAxis *axisX = dynamic_cast<QValueAxis*>(this->chart()->axisX());
const double xMin = axisX->min();
const double xMax = axisX->max();
const double xCentral = curVal.x();
double leftOffset;
double rightOffset;
if (event->delta() > 0)
{//放大
leftOffset = 1.0 / factor * (xCentral - xMin);
rightOffset = 1.0 / factor * (xMax - xCentral);
}
else
{//缩小
leftOffset = 1.0 * factor * (xCentral - xMin);
rightOffset = 1.0 * factor * (xMax - xCentral);
}
this->chart()->axisX()->setRange(xCentral - leftOffset, xCentral + rightOffset);
// }
}
void ChartView::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Control)
{
m_ctrlPress = true;
}
}
void ChartView::keyReleaseEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Control)
{
m_ctrlPress = false;
}
}
void ChartView::saveAxisRange()
{
QValueAxis *axisX = dynamic_cast<QValueAxis*>(this->chart()->axisX());
m_xMin = axisX->min();
m_xMax = axisX->max();
QValueAxis *axisY = dynamic_cast<QValueAxis*>(this->chart()->axisY());
m_yMin = axisY->min();
m_yMax = axisY->max();
}
十四、自定义MyChart库
此库不包含窗口的一些事件操作,只适用于基础的chart
MyChart.h
#ifndef MYCHART_H
#define MYCHART_H
#include <QtCharts>
#include <QChartGlobal>
#include <QMouseEvent>
using namespace QtCharts;
typedef struct axis
{
qreal min;
qreal max;
}str_axis;
class MyChart : public QChart
{
Q_OBJECT
// 注意:必须按顺序执行。
// 1、先要执行init_coordinate_system,
// 2、设置图表或坐标轴属性参数(可省略),
// 3、中间执行创建的序列(可省略),
// 4、设置序列属性参数(可省略),
// 5、最后执行addChartToView
public:
MyChart();
void init_coordinate_system();//初始化坐标
void addChartToView(QChartView *chartView);//将图表加入画布
QScatterSeries* createScattersSerials();//创建散点序列
QLineSeries* createLineSerials();//创建折线序列
QBarSeries* createBarsSerials(QStringList categories);//创建柱状序列,categories:用于横坐标的字符串列表
QBarSet* createBarsSet();//创建柱状数据集
QPieSeries * createPieSerials();//创建饼状序列
//====================chart相关参数方法====================
public:
QChart* get_chart();
void chart_setTitle(QString title = "标题");//图表标题
void chart_setBackgroundVisible(bool visible);//设置背景是否隐藏
void chart_setFont(QFont font);//图表标题字体
void chart_setBrush(QBrush brush);//图表标题颜色
void chart_setTheme(QChart::ChartTheme theme = QChart::ChartThemeBlueIcy);//图表主题
void chart_setBackgroundBrush(QBrush brush);//设置背景颜色
void chart_setBackgroundPen(QPen pen);//设置边框颜色
void chart_setMargin(QMargins &margins);//设置绘图区与图表边界的4个边距
void chart_hideLabel();//隐藏图表标签legend
void chart_setAnimation(QChart::AnimationOptions option = QChart::AllAnimations);//设置序列或坐标轴的动画效果
//====================坐标轴相关参数方法====================
public:
void coordinate_setAxisXRange(str_axis str_axis_param);//设置x轴范围
void coordinate_setAxisYRange(str_axis str_axis_param);//设置y轴范围
void coordinate_setAxisXMin(qreal min);//设置x轴最小值
void coordinate_setAxisXMax(qreal max);//设置x轴最大值
void coordinate_setAxisYMin(qreal min);//设置y轴最小值
void coordinate_setAxisYMax(qreal max);//设置y轴最大值
void coordinate_setAxisXTitle(QString title = "x轴标题");//设置x轴标题
void coordinate_setAxisYTitle(QString title = "y轴标题");//设置y轴标题
void coordinate_setAxisXTitleVisible(bool visible = false);//设置x轴标题可见性
void coordinate_setAxisYTitleVisible(bool visible = false);//设置y轴标题可见性
void coordinate_setAxisX2(str_axis str_axis_param,Qt::Alignment alignment = Qt::AlignTop);//设置第二条X轴
void coordinate_setAxisY2(str_axis str_axis_param,Qt::Alignment alignment = Qt::AlignRight);//设置第二条Y轴
void coordinate_setreverseAxisX();//反转x轴
void coordinate_setreverseAxisY();//反转y轴
//====================轴标签相关参数方法====================
public:
void axislabel_setAxisXLabelAngle(int angle);//x轴标签的角度
void axislabel_setAxisYLabelAngle(int angle);//y轴标签的角度
void axislabel_setAxisXLabelColor(QColor color);//x轴标签的颜色
void axislabel_setAxisYLabelColor(QColor color);//y轴标签的颜色
void axislabel_setAxisXLabelFont(QFont font);//x轴标签的字体
void axislabel_setAxisYLabelFont(QFont font);//y轴标签的字体
//====================刻度线相关参数方法====================
public:
void tick_setAxisXTickCount(int count);//设置x坐标轴主刻度个数
void tick_setAxisYTickCount(int count);//设置Y坐标轴主刻度个数
void tick_setAxisXMinorTickCount(int count);//设置x坐标轴两个主刻度之间的次刻度的个数
void tick_setAxisYMinorTickCount(int count);//设置x坐标轴两个主刻度之间的次刻度的个数
void tick_setAxisXTickColor(QColor color);//设置x坐标轴主刻度颜色
void tick_setAxisYTickColor(QColor color);//设置Y坐标轴主刻度颜色
//====================网格线相关参数方法====================
public:
void gridline_setAxisXGridLineColor(QColor color);//设置x坐标轴网格线颜色
void gridline_setAxisYGridLineColor(QColor color);//设置Y坐标轴网格线颜色
void gridline_setAxisXMainGridLineVisible(bool visible = false);//设置主网格线可见性
void gridline_setAxisYMainGridLineVisible(bool visible = false);//设置主网格线可见性
void gridline_setAxisXSubGridLineVisible(bool visible = false);//设置次网格线可见性
void gridline_setAxisYSubGridLineVisible(bool visible = false);//设置次网格线可见性
//====================散点属性参数方法====================
public:
void scatter_setData(QChartView *chartView,QScatterSeries* scatterSeries,QList<QPointF> list,bool isAppendData = false);//设置数据,isAppendData:是否追加数据
void scatter_setData(QChartView *chartView,QScatterSeries* scatterSeries,QPointF pointF,bool isAppendData = false);//设置数据,isAppendData:是否追加数据
void scatter_setData(QChartView *chartView,QScatterSeries* scatterSeries,qreal x,qreal y,bool isAppendData = false);//设置数据,isAppendData:是否追加数据
void scatter_setName(QScatterSeries* scatterSeries,QString name = "散点");//设置名称
void scatter_setSize(QScatterSeries* scatterSeries,quint32 size = 7);//设置点大小
int scatter_count(QScatterSeries* scatterSeries);//返回数据点个数
void scatter_setVisible(QScatterSeries* scatterSeries,bool visible);//设置序列可见性
void scatter_setPointsVisible(QScatterSeries* scatterSeries,bool visible);//设置数据点可见性
void scatter_setPointLabelsVisible(QScatterSeries* scatterSeries,bool visible);//设置数据点标签可见性
void scatter_setPointLabelsColor(QScatterSeries* scatterSeries,QColor color);//设置数据点标签颜色
void scatter_setOpacity(QScatterSeries* scatterSeries,qreal opacity);//设置序列透明度,0表示完全透明,1表示不透明
void scatter_setColor(QScatterSeries* scatterSeries,QColor color);//设置点颜色
void scatter_setShape(QScatterSeries* scatterSeries,QScatterSeries::MarkerShape shape = QScatterSeries::MarkerShapeCircle);//设置点形状
//====================折线属性参数方法====================
public:
void line_setData(QChartView *chartView,QLineSeries* lineSeries,QList<QPointF> list,bool isAppendData = false);//设置数据,isAppendData:是否追加数据
void line_setData(QChartView *chartView,QLineSeries* lineSeries,QPointF pointF,bool isAppendData = false);//设置数据,isAppendData:是否追加数据
void line_setData(QChartView *chartView,QLineSeries* lineSeries,qreal x,qreal y,bool isAppendData = false);//设置数据,isAppendData:是否追加数据
void line_setName(QLineSeries* lineSeries,QString name = "折线");//设置名称
int line_count(QLineSeries* lineSeries);//返回数据点个数
void line_setVisible(QLineSeries* lineSeries,bool visible);//设置序列可见性
void line_setPointsVisible(QLineSeries* lineSeries,bool visible);//设置数据点可见性
void line_setPointLabelsVisible(QLineSeries* lineSeries,bool visible);//设置数据点标签可见性
void line_setPointLabelsColor(QLineSeries* lineSeries,QColor color);//设置数据点标签颜色
void line_setOpacity(QLineSeries* lineSeries,qreal opacity);//设置序列透明度,0表示完全透明,1表示不透明
void line_setColor(QLineSeries* lineSeries,QColor color);//设置线条颜色
//====================柱状属性参数方法====================
public:
void bar_setData(QChartView *chartView,QBarSeries* barSeries,QBarSet *barSet);//设置数据,适用于一个数据集
void bar_setData(QChartView *chartView,QBarSeries* barSeries,QList<QBarSet*> list);//设置数据,适用于多个数据集
void bar_setBarWidth(QBarSeries* barSeries,qreal width);//设置数据棒的宽度
void bar_setLabelsVisible(QBarSeries* barSeries,bool visible);//设置数据棒标签可见性
void bar_setLabelsPosition(QBarSeries* barSeries,QAbstractBarSeries::LabelsPosition position);//设置数据棒标签位置
void bar_setLabelColor(QBarSet* barSet,QColor color);//设置数据集标签文字颜色
void bar_setLabel(QBarSet* barSet,QString name);//设置数据集的名称
void bar_setBrush(QBarSet* barSet,QBrush brush);//设置数据集的颜色,纹理,渐变
void bar_setBorderColor(QBarSet* barSet,QColor color);//设置数据集的颜色,纹理,渐变
//====================饼状属性参数方法====================
public:
void pie_setData(QChartView *chartView,QPieSeries* pieSeries,QStringList strList,QList<qreal> valueList);//设置数据,strList:数据名称,valueList:数据值
void pie_setExploded(QPieSeries* pieSeries,int index,bool visible);//设置exploded动画效果,index:哪块区域的效果下标
void pie_setLabelsVisible(QPieSeries* pieSeries,bool visible);//设置饼图划分的提示
void pie_setLabel(QPieSeries* pieSeries,int index,QString name);//设置切片标签,index:哪块区域的效果下标,name:名称
void pie_setBrush(QPieSeries* pieSeries,int index,QBrush brush);//设置饼图颜色,index:哪块区域的效果下标
private:
QChartView *chartView;
QChart *chart;//图表
QValueAxis *axisX;//x轴
QValueAxis *axisY;//y轴
QValueAxis *axisX2;//x2轴
QValueAxis *axisY2;//y2轴
};
#endif // MYCHART_H
MyChart.cpp
#include "mychart.h"
MyChart::MyChart() {
//创建图表
chart = new QChart(this);
//创建xy坐标
axisX = new QValueAxis(this);
axisY = new QValueAxis(this);
//设置第二条坐标为空
axisX2 = nullptr;
axisY2 = nullptr;
}
void MyChart::init_coordinate_system()
{
// 设置坐标范围
axisX->setRange(-20,20);
axisY->setRange(-20,20);
// 将坐标加入图表,并设置坐标位置
chart->addAxis(axisX,Qt::AlignBottom);
chart->addAxis(axisY,Qt::AlignLeft);
}
void MyChart::addChartToView(QChartView *chartView)
{
chartView->setChart(chart);
chartView->setRenderHint(QPainter::Antialiasing);//启用抗锯齿
}
QScatterSeries* MyChart::createScattersSerials()
{
QScatterSeries *scatterSeries = new QScatterSeries(this);
//将散点加入图表中
chart->addSeries(scatterSeries);
//关联xy轴
scatterSeries->attachAxis(axisX);
scatterSeries->attachAxis(axisY);
if(axisX2){
scatterSeries->attachAxis(axisX2);
}
if(axisY2){
scatterSeries->attachAxis(axisY2);
}
return scatterSeries;
}
QLineSeries *MyChart::createLineSerials()
{
QLineSeries *lineSeries = new QLineSeries(this);
//将散点加入图表中
chart->addSeries(lineSeries);
//关联xy轴
lineSeries->attachAxis(axisX);
lineSeries->attachAxis(axisY);
if(axisX2){
lineSeries->attachAxis(axisX2);
}
if(axisY2){
lineSeries->attachAxis(axisY2);
}
return lineSeries;
}
QBarSeries *MyChart::createBarsSerials(QStringList categories)
{
QBarSeries *barSeries = new QBarSeries(this);
//将散点加入图表中
chart->addSeries(barSeries);
//用于柱状图的横坐标
QBarCategoryAxis *barAxisX = new QBarCategoryAxis;
if(axisX){
chart->removeAxis(axisX);//防止同时出现2个x轴
}
chart->addAxis(barAxisX,Qt::AlignBottom);
barAxisX->append(categories);
barAxisX->setRange(categories[0],categories[categories.length()-1]);
//关联xy轴
barSeries->attachAxis(barAxisX);
barSeries->attachAxis(axisY);
if(axisY2){
barSeries->attachAxis(axisY2);
}
return barSeries;
}
QBarSet *MyChart::createBarsSet()
{
QBarSet *barSet = new QBarSet("数据");
return barSet;
}
QPieSeries *MyChart::createPieSerials(){
QPieSeries *pieSeries = new QPieSeries(this);
//将散点加入图表中
chart->addSeries(pieSeries);
return pieSeries;
}
QChart *MyChart::get_chart()
{
if(chart){
return chart;
}
return nullptr;
}
//====================chart相关参数方法====================
void MyChart::chart_setTitle(QString title){chart->setTitle(title);}
void MyChart::chart_setBackgroundVisible(bool visible){chart->setBackgroundVisible(visible);}
void MyChart::chart_setFont(QFont font){chart->setTitleFont(font);}
void MyChart::chart_setBrush(QBrush brush){chart->setTitleBrush(brush);}
void MyChart::chart_setTheme(ChartTheme theme){chart->setTheme(theme);}
void MyChart::chart_setBackgroundBrush(QBrush brush){chart->setBackgroundBrush(brush);}
void MyChart::chart_setBackgroundPen(QPen pen){chart->setBackgroundPen(pen);}
void MyChart::chart_setMargin(QMargins &margins){chart->setMargins(margins);}
void MyChart::chart_hideLabel(){chart->legend()->hide();}
void MyChart::chart_setAnimation(AnimationOptions option){chart->setAnimationOptions(option);}
//====================坐标轴相关参数方法====================
void MyChart::coordinate_setAxisXRange(str_axis str_axis_param){axisX->setRange(str_axis_param.min,str_axis_param.max);}
void MyChart::coordinate_setAxisYRange(str_axis str_axis_param){axisY->setRange(str_axis_param.min,str_axis_param.max);}
void MyChart::coordinate_setAxisXMin(qreal min){axisX->setMin(min);}
void MyChart::coordinate_setAxisXMax(qreal max){axisX->setMax(max);}
void MyChart::coordinate_setAxisYMin(qreal min){axisY->setMin(min);}
void MyChart::coordinate_setAxisYMax(qreal max){axisY->setMin(max);}
void MyChart::coordinate_setAxisXTitle(QString title){axisX->setTitleText(title);}
void MyChart::coordinate_setAxisYTitle(QString title){axisY->setTitleText(title);}
void MyChart::coordinate_setAxisXTitleVisible(bool visible){axisX->setTitleVisible(visible);}
void MyChart::coordinate_setAxisYTitleVisible(bool visible){axisY->setTitleVisible(visible);}
void MyChart::coordinate_setAxisX2(str_axis str_axis_param, Qt::Alignment alignment)
{
axisX2 = new QValueAxis(this);
// 设置坐标范围
axisX2->setRange(str_axis_param.min,str_axis_param.max);
// 将坐标加入图表,并设置坐标位置
chart->addAxis(axisX2,alignment);
}
void MyChart::coordinate_setAxisY2(str_axis str_axis_param, Qt::Alignment alignment)
{
axisY2 = new QValueAxis(this);
// 设置坐标范围
axisY2->setRange(str_axis_param.min,str_axis_param.max);
// 将坐标加入图表,并设置坐标位置
chart->addAxis(axisY2,alignment);
}
void MyChart::coordinate_setreverseAxisX(){axisX->setReverse(true);}
void MyChart::coordinate_setreverseAxisY(){axisY->setReverse(true);}
//====================轴标签属性参数方法====================
void MyChart::axislabel_setAxisXLabelAngle(int angle){axisX->setLabelsAngle(angle);}
void MyChart::axislabel_setAxisYLabelAngle(int angle){axisY->setLabelsAngle(angle);}
void MyChart::axislabel_setAxisXLabelColor(QColor color){axisX->setLabelsColor(color);}
void MyChart::axislabel_setAxisYLabelColor(QColor color){axisY->setLabelsColor(color);}
void MyChart::axislabel_setAxisXLabelFont(QFont font){axisX->setLabelsFont(font);}
void MyChart::axislabel_setAxisYLabelFont(QFont font){axisY->setLabelsFont(font);}
//====================轴标签相关参数方法====================
void MyChart::tick_setAxisXTickCount(int count){axisX->setTickCount(count);}
void MyChart::tick_setAxisYTickCount(int count){axisY->setTickCount(count);}
void MyChart::tick_setAxisXMinorTickCount(int count){axisX->setMinorTickCount(count);}
void MyChart::tick_setAxisYMinorTickCount(int count){axisY->setMinorTickCount(count);}
void MyChart::tick_setAxisXTickColor(QColor color){axisX->setLinePenColor(color);}
void MyChart::tick_setAxisYTickColor(QColor color){axisY->setLinePenColor(color);}
//====================网格线相关参数方法====================
void MyChart::gridline_setAxisXGridLineColor(QColor color){axisX->setGridLineColor(color);}
void MyChart::gridline_setAxisYGridLineColor(QColor color){axisY->setGridLineColor(color);}
void MyChart::gridline_setAxisXMainGridLineVisible(bool visible){axisX->setGridLineVisible(visible);}
void MyChart::gridline_setAxisYMainGridLineVisible(bool visible){axisY->setGridLineVisible(visible);}
void MyChart::gridline_setAxisXSubGridLineVisible(bool visible){axisX->setMinorGridLineVisible(visible);}
void MyChart::gridline_setAxisYSubGridLineVisible(bool visible){axisY->setMinorGridLineVisible(visible);}
//====================散点属性参数方法====================
void MyChart::scatter_setData(QChartView *chartView,QScatterSeries *scatterSeries,QList<QPointF> list,bool isAppendData)
{
if(!isAppendData){
// 清空旧数据
scatterSeries->clear();
}
// 加入散点数据
scatterSeries->append(list);
// 更新图表视图
chartView->update();
}
void MyChart::scatter_setData(QChartView *chartView, QScatterSeries *scatterSeries, QPointF pointF,bool isAppendData)
{
if(!isAppendData){
// 清空旧数据
scatterSeries->clear();
}
// 加入散点数据
scatterSeries->append(pointF);
// 更新图表视图
chartView->update();
}
void MyChart::scatter_setData(QChartView *chartView, QScatterSeries *scatterSeries, qreal x, qreal y,bool isAppendData)
{
if(!isAppendData){
// 清空旧数据
scatterSeries->clear();
}
// 加入散点数据
scatterSeries->append(x,y);
// 更新图表视图
chartView->update();
}
void MyChart::scatter_setName(QScatterSeries *scatterSeries, QString name){scatterSeries->setName(name);}
void MyChart::scatter_setSize(QScatterSeries *scatterSeries, quint32 size){scatterSeries->setMarkerSize(size);}
int MyChart::scatter_count(QScatterSeries *scatterSeries){return scatterSeries->count();}
void MyChart::scatter_setVisible(QScatterSeries *scatterSeries, bool visible){scatterSeries->setVisible(visible);}
void MyChart::scatter_setPointsVisible(QScatterSeries *scatterSeries, bool visible){scatterSeries->setPointsVisible(visible);}
void MyChart::scatter_setPointLabelsVisible(QScatterSeries *scatterSeries, bool visible){scatterSeries->setPointLabelsVisible(visible);}
void MyChart::scatter_setPointLabelsColor(QScatterSeries *scatterSeries, QColor color){scatterSeries->setPointLabelsColor(color);}
void MyChart::scatter_setOpacity(QScatterSeries *scatterSeries, qreal opacity){scatterSeries->setOpacity(opacity);}
void MyChart::scatter_setShape(QScatterSeries *scatterSeries, QScatterSeries::MarkerShape shape){scatterSeries->setMarkerShape(shape);}
void MyChart::scatter_setColor(QScatterSeries *scatterSeries, QColor color){scatterSeries->setColor(color);}
//====================折线属性参数方法====================
void MyChart::line_setData(QChartView *chartView,QLineSeries* lineSeries, QList<QPointF> list, bool isAppendData)
{
if(!isAppendData){
// 清空旧数据
lineSeries->clear();
}
// 加入散点数据
lineSeries->append(list);
// 更新图表视图
chartView->update();
}
void MyChart::line_setData(QChartView *chartView,QLineSeries* lineSeries, QPointF pointF, bool isAppendData)
{
if(!isAppendData){
// 清空旧数据
lineSeries->clear();
}
// 加入散点数据
lineSeries->append(pointF);
// 更新图表视图
chartView->update();
}
void MyChart::line_setData(QChartView *chartView,QLineSeries* lineSeries, qreal x, qreal y, bool isAppendData)
{
if(!isAppendData){
// 清空旧数据
lineSeries->clear();
}
// 加入散点数据
lineSeries->append(x,y);
// 更新图表视图
chartView->update();
}
void MyChart::line_setName(QLineSeries *lineSeries, QString name){lineSeries->setName(name);}
int MyChart::line_count(QLineSeries *lineSeries){return lineSeries->count();}
void MyChart::line_setVisible(QLineSeries *lineSeries, bool visible){lineSeries->setVisible(visible);}
void MyChart::line_setPointsVisible(QLineSeries *lineSeries, bool visible){lineSeries->setPointsVisible(visible);}
void MyChart::line_setPointLabelsVisible(QLineSeries *lineSeries, bool visible){lineSeries->setPointLabelsVisible(visible);}
void MyChart::line_setPointLabelsColor(QLineSeries *lineSeries, QColor color){lineSeries->setPointLabelsColor(color);}
void MyChart::line_setOpacity(QLineSeries *lineSeries, qreal opacity){lineSeries->setOpacity(opacity);}
void MyChart::line_setColor(QLineSeries *lineSeries, QColor color){lineSeries->setColor(color);}
//====================柱状属性参数方法====================
void MyChart::bar_setData(QChartView *chartView,QBarSeries* barSeries,QBarSet *barSet)
{
// 清空旧数据
barSeries->clear();
// 加入数据
barSeries->append(barSet);
// 更新图表视图
chartView->update();
}
void MyChart::bar_setData(QChartView *chartView, QBarSeries *barSeries, QList<QBarSet*> list)
{
// 清空旧数据
barSeries->clear();
// 加入数据
barSeries->append(list);
// 更新图表视图
chartView->update();
}
void MyChart::bar_setBarWidth(QBarSeries *barSeries, qreal width){barSeries->setBarWidth(width);}
void MyChart::bar_setLabelsVisible(QBarSeries *barSeries, bool visible){barSeries->setLabelsVisible(visible);}
void MyChart::bar_setLabelsPosition(QBarSeries *barSeries, QAbstractBarSeries::LabelsPosition position){barSeries->setLabelsPosition(position);}
void MyChart::bar_setLabelColor(QBarSet *barSet, QColor color){barSet->setLabelColor(color);}
void MyChart::bar_setLabel(QBarSet *barSet, QString name){barSet->setLabel(name);barSet->setLabelColor(Qt::red);}
void MyChart::bar_setBrush(QBarSet *barSet, QBrush brush){barSet->setBrush(brush);}
void MyChart::bar_setBorderColor(QBarSet *barSet, QColor color){barSet->setBorderColor(color);}
//====================饼状属性参数方法====================
void MyChart::pie_setData(QChartView *chartView, QPieSeries *pieSeries, QStringList strList, QList<qreal> valueList)
{
// 清空旧数据
pieSeries->clear();
// 加入数据
if(strList.size() == valueList.size()){
for(int i=0;i<valueList.size();i++){
pieSeries->append(strList.at(i),valueList.at(i));
}
}
// 更新图表视图
chartView->update();
}
void MyChart::pie_setExploded(QPieSeries *pieSeries, int index, bool visible)
{
QPieSlice *slice = pieSeries->slices().at(index);
slice->setExploded(visible);
}
void MyChart::pie_setLabelsVisible(QPieSeries *pieSeries, bool visible){pieSeries->setLabelsVisible(visible);}
void MyChart::pie_setLabel(QPieSeries *pieSeries, int index, QString name)
{
QPieSlice *slice = pieSeries->slices().at(index);
slice->setLabel(name);
}
void MyChart::pie_setBrush(QPieSeries *pieSeries, int index, QBrush brush)
{
QPieSlice *slice = pieSeries->slices().at(index);
slice->setBrush(brush);
}
参考调用方法
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
myChart = new MyChart;
myChart->init_coordinate_system();
//=====================================================================
// QScatterSeries *scatterSeries1 = myChart->createScattersSerials();
// myChart->chart_hideLabel();
// myChart->scatter_setName(scatterSeries1,"散点1");
// myChart->scatter_setShape(scatterSeries1,QScatterSeries::MarkerShapeRectangle);
// // myChart->scatter_setVisible(scatterSeries1,false);
// myChart->scatter_setPointsVisible(scatterSeries1,false);
// myChart->scatter_setData(ui->graphicsView,scatterSeries1,1,1);
// QScatterSeries *scatterSeries2 = myChart->createScattersSerials();
// myChart->scatter_setName(scatterSeries2,"散点2");
// myChart->scatter_setShape(scatterSeries2);
// myChart->scatter_setData(ui->graphicsView,scatterSeries2,10,20);
//=====================================================================
// myChart->coordinate_setAxisXTitle();
// myChart->coordinate_setAxisYTitle();
// myChart->axislabel_setAxisXLabelColor(Qt::red);
// myChart->tick_setAxisXMinorTickCount(4);
//=====================================================================
// myChart->chart_hideLabel();
// lineserials1 = myChart->createLineSerials();
// myChart->line_setData(ui->graphicsView,lineserials1,1,1,true);
// myChart->line_setData(ui->graphicsView,lineserials1,2,2,true);
// myChart->line_setData(ui->graphicsView,lineserials1,6,6,true);
// myChart->line_setData(ui->graphicsView,lineserials1,10,10,true);
// QLineSeries *lineserials2 = myChart->createLineSerials();
// myChart->line_setData(ui->graphicsView,lineserials2,-1,-1,true);
// myChart->line_setData(ui->graphicsView,lineserials2,-2,-2,true);
// myChart->line_setData(ui->graphicsView,lineserials2,-6,-6,true);
// myChart->line_setData(ui->graphicsView,lineserials2,-10,-10,true);
// myChart->line_setColor(lineserials2,Qt::red);
//=====================================================================
// QStringList list;
// list << "学生1" << "学生2" << "学生3" << "学生4";
// QBarSeries *serials = myChart->createBarsSerials(list);
// QBarSet *set1 = myChart->createBarsSet();
// QBarSet *set2 = myChart->createBarsSet();
// QBarSet *set3 = myChart->createBarsSet();
// *set1 << QRandomGenerator::global()->bounded(0, 20)
// << QRandomGenerator::global()->bounded(0, 20)
// << QRandomGenerator::global()->bounded(0, 20)
// << QRandomGenerator::global()->bounded(0, 20);
// *set2 << QRandomGenerator::global()->bounded(0, 20)
// << QRandomGenerator::global()->bounded(0, 20)
// << QRandomGenerator::global()->bounded(0, 20)
// << QRandomGenerator::global()->bounded(0, 20);
// *set3 << QRandomGenerator::global()->bounded(0, 20)
// << QRandomGenerator::global()->bounded(0, 20)
// << QRandomGenerator::global()->bounded(0, 20)
// << QRandomGenerator::global()->bounded(0, 20);
// QList<QBarSet*> barList;
// barList << set1 << set2 << set3;
// myChart->bar_setData(ui->graphicsView,serials,barList);
// myChart->bar_setLabel(set1,"数据1");
// myChart->bar_setLabel(set2,"数据2");
// myChart->bar_setLabel(set3,"数据3");
//=====================================================================
// QPieSeries *pieSeries = myChart->createPieSerials();
// QStringList strList;
// strList << "数据1" << "数据2" << "数据3" << "数据4" << "数据5";
// QList<qreal> valueList;
// valueList << 10 << 5 << 14 << 24 << 30;
// myChart->pie_setData(ui->graphicsView,pieSeries,strList,valueList);
// myChart->pie_setLabelsVisible(pieSeries,true);
// myChart->pie_setLabel(pieSeries,0,"35%");
// myChart->pie_setLabel(pieSeries,1,"15%");
//=====================================================================
// TestForm *testForm = new TestForm(this);
// QGridLayout *testLayout = new QGridLayout(ui->testWidget);
// testLayout->addWidget(testForm);
myChart->addChartToView(ui->graphicsView);
}
MainWindow::~MainWindow()
{
delete ui;
}
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)