目录
[1.1 坐标轴-QAbstractAxis](#1.1 坐标轴-QAbstractAxis)
[1.2 系列-QAbstractSeries](#1.2 系列-QAbstractSeries)
[1.3 图例-Legend](#1.3 图例-Legend)
[1.4 图表-QChart](#1.4 图表-QChart)
[1.5 视图-QChartView](#1.5 视图-QChartView)
[2、 QT 折线图](#2、 QT 折线图)
[2.1 Qt 折线图介绍](#2.1 Qt 折线图介绍)
[2.2 Qt 折线图实现](#2.2 Qt 折线图实现)
Qt 图表是专门用来数据可视化的控件
Qt 图表包含折线、饼图、棒图、散点图、范围图等。
使用 Qt 图表时,需要添加 Qt += charts
包含头文件 #include
1、概念
1.1 坐标轴-QAbstractAxis
图表中,一般都有 X、Y 坐标轴,复杂一些的还带有 Z 轴。对应到 Qt 的图表也有 X、Y 轴对象。但是 今天,我们先不展开介绍。如果我们不创建轴坐标对应的对象,可以使用 Qt 的默认轴对象。后面我们会介绍用 法。
1.2 系列-QAbstractSeries
不论是曲线、饼图、棒图还是其他图表,其中展示的内容本质都是数据。一条曲线是一组数据,一个饼图也 对应一组数据。在 Qt Charts 中,这些一组组的数据被称作系列。对应不同类型的图表 Qt 提供了不同的系列。 系列除了负责存储、访问数据,应该还提供了数据的绘制方法,比如折线图和曲线图分别对应 QLineSerie 和 QSPLineSerie。我们可以用不同的系列达到不同的展示目的。
1.3 图例-Legend
类似于 Excel,Qt Charts 中也提供了图例,并且还可以显示或者隐藏图例。
1.4 图表-QChart
Qt 提供了 QChart 类来封装前面所说的内容,比如坐标轴、系列、图例等。QChart 承担了一个组织、管理 的角色。QChart 派生自 QGraphicsObject,因此它实际上是一个图元 item。我们可以从 QChart 获取到坐标轴对 象、数据系列对象、图例等等,并且可以设置图表的主题、背景色等样式信息。
1.5 视图-QChartView
负责 QChart 的展示。QChart 本身只负责图表内容的组织、管理。图表的展示由视图负责,这个视图就是 QChartView。QChartView 派生自 QGraphicsView,只是它专门提供了几个面向 QChart 的接口,比如 setChart (QChart*)等。
2、 QT 折线图
2.1 Qt 折线图介绍
Qt 折线图使用的类是 QlineSeries。
Qt 折线图包含如下几个部分: ① 坐标轴(x,y) ② 线条 ③ 参考背景线
2.2 Qt 折线图实现
Qt 折线图实现过程主要包括以下几个步骤:
-
新建一个 QChart 图表对象 chart;
-
往 chart 添加坐标轴(x,y 轴);
-
在 ui 里提升一个 QWidget 成 QChartView,作为 chart 的视图;
-
在 chart 里添加新的折线对象 QLineSeries(可添加多条)
-
添加数据
-
清除数据
一.新建一个 QChart 图表对象 chart
cs
QChart *chart = new QChart();
chart->legend()->setVisible(true);
QFont font;
font.setPixelSize(50);
chart->setTitleFont(font);
chart->setTitle("小红体重曲线");//设置图表标题
二.往 chart 添加坐标轴(x 轴,y 轴)
cpp
QValueAxis *axisX;
axisX = new QValueAxis();
axisX->setTitleText("时间"); //设置坐标轴的标题
axisX->setLabelFormat("%i"); //设置坐标格式,类似于 printf
axisX->setTickCount(10); //坐标被分成多少格
axisX->setRange(0, 60); //设置范围
//Bottom 是底部的意思,意思是坐标轴是放在底部的,也就是 X 轴
//相似的还有 Qt::AlignLeft...
chart->addAxis(axisX, Qt::AlignBottom);
QValueAxis *axisY;
axisY = new QValueAxis();
axisY->setTitleText("体重"); //设置坐标轴的标题
axisY->setLabelFormat("%i"); //设置坐标格式
axisY->setTickCount(5); //坐标被分成多少格
axisY->setRange(0, 200); //设置范围
chart->addAxis(axisY, Qt::AlignLeft);
三.在 ui 里提升一个 QWidget 成 QChartView,作为 chart 的视图;
四.在 chart 里添加新的折线对象 QLineSeries(可添加多条)
cpp
line = new QLineSeries;
line->setName("体重曲线"); //设置线的名字
line->setColor(Qt::red); //设置线的颜色
chart->addSeries(line); //把曲线加到图表里 //设置曲线遵循哪个坐标,它会自动
识别 x,y 轴,因为坐标轴里的 AlignBottom/AlignLeft 属性
line->attachAxis(axisX);
line->attachAxis(axisY);
ui->chartView->setChart(chart);//把拆线添加到控件
五.添加数据,使用定时器模拟
- 定时器初始化
cpp
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));
x = 0;
timer->start(1000);
- 定时器槽函数
cpp
void Widget::doTimeoutSlot()
{
y = qrand() % 200; //生成随机数,范围在 200 以内,因为我们 y 轴最大是 200
qDebug()<<"y="<<y;
if(x > 60){
x = 0;
line->clear();
}else{
line->append(x, y);
x++;
}
}
六.清除数据 line->clear();