一、相关类的介绍

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设置 

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坐标轴的创建 

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画布中

七、散点图

QScatterSeries类的主要函数
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);

效果图:

八、折线图

QLineSeries类的主要函数
序列名称 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);

效果图:

九、柱状图

QBarSet类的主要函数功能
标签 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);

效果图:

十、饼状图

QPieSeries类的主要函数功能
分块操作 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);

效果图:

十一、极坐标(雷达)

QPolarChart类的主要函数
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;
}

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐