QChart相关内容(刷新,图例,绘制双曲线,自定义坐标系):
刷新的核心:
添加新的数据前,使用:
chart->removeAllSeries();//清除即可, 重要操作,QChart刷新的必要操作
QChart创建完整创建过程:
第一部分:数据预处理
将相关数据压入list中,数据类型为QPoint类型
第二部分:添加数据
保存需要绘制曲线的Y值:
serial->append(list_2);//在serial中添加数据
QlineSeries可以设置曲线的名称:
serial->setName("Line 2");
第三部分:核心部分,可以把这个部分看成是图表所有相关内容,属性的设置部分
QChart负责的部分,图例的设置,XY坐标,具体的数值,都需要添加到QCahrt对应的对象中
chart->addSeries(serial);//将数据加载到QChart中
第四部分:简单理解成画布,将已经完成的图表进行展示
注意:初始化的时候展示一次即可,后续的刷新部分,只需要对QCahrt中的相关内容进行设置即可
QChartView *view=new QChartView(chart);//准备将chart进行显示
//这个应该不用说的,消除锯齿
view->setRenderHint(QPainter::Antialiasing);
view->setFixedSize(600,600);
程序如下:
//Part1 在界面初始化的时候,就已经将QChart初始化了
void Widget::UiForEC()
{
......
//此部分为QChart初始化
//将一系列数据存入serial.
//添加第一条线
QList<QPointF>list;//将数据压入链表中
QLineSeries *serial;//QChart的具体数据内容
serial = new QLineSeries(this);//必须要new, 才能实现更新
list<<QPointF(0,0)<<QPointF(Number_Size,0);//将数据压入链表中
serial->setName("Line 1");//名称
serial->append(list);//在serial中添加数据
chart->addSeries(serial);//将数据加载到QChart中
//添加第二条线
//绘制 两条线的方式
QList<QPointF>list_2;
list_2<<QPointF(0,0)<<QPointF(Number_Size,Number_Size);
serial = new QLineSeries(this);//需要赋予serial新的地址才有效,这也是在同一张绘制两条曲线的关键
serial->append(list_2);//在serial中添加数据
serial->setName("Line 2");
chart->addSeries(serial);//将数据加载到QChart中
//进行信号与槽的连接
connectMarkers();
chart->createDefaultAxes();//根据数据集,自动创建坐标轴,坐标轴的区间恰好完全容纳已有的数据集
chart->setTitle("SAW");//chart名称
chart->setAnimationOptions(QChart::SeriesAnimations);//以动画的形式显示
chart->legend()->setVisible(true);//图例显示
chart->legend()->setAlignment(Qt::AlignBottom);//(图例的位置)
//最后需要将chart交给QChartView
QChartView *view=new QChartView(chart);//将chart进行显示
view->setRenderHint(QPainter::Antialiasing);//消除锯齿
view->setFixedSize(600,600);//chart大小
........
}
..........
//之后需要根据需求,对QChart进行重新绘制或者刷新
void Widget::PutItOnScreen(QList<double> * PIOS,int size,QList<double> * ERROR1,QList<double> * ERROR2)
{
.......
QList<QPointF> listForChartLINE1;
QList<QPointF> listForChartLINE2;
//添加数据
for(int i = 0;i<Number_Size;i++)
{
listForChartLINE1.append(QPointF(i,ERROR1->at(i)));
listForChartLINE2.append(QPointF(i,ERROR2->at(i)));
qDebug()<<ERROR2->at(i);
}
QLineSeries *serial;
//removeAllSeries是关键操作,只有这样,才能将之前的曲线完全剔除
chart->removeAllSeries();//清除即可,重要操作,QChart刷新的必要操作
//添加第一条线
serial = new QLineSeries(this);//必须要new, 才能实现更新
serial->append(listForChartLINE1);//在serial中添加数据
serial->setName("Err");
// chart->createDefaultAxes();
chart->addSeries(serial);//将数据加载到QChart中
//规定坐标系,注意,每次添加一条曲线,都需要进行坐标系的确定
QValueAxis *axisX = new QValueAxis();//轴变量、数据系列变量,都不能声明为局部临时变量
QValueAxis *axisY = new QValueAxis();//创建X/Y轴
axisX->setRange(0, Number_Size);
// axisY->setRange(MIN_D, MAX_D);//设置X/Y显示的区间Y_MINY_MAX
axisY->setRange(Y_MIN, Y_MAX);//设置X/Y显示的区间
chart->setAxisX(axisX);
chart->setAxisY(axisY);//设置chart的坐标轴
serial->attachAxis(axisY);
//添加第二条线
serial = new QLineSeries(this);
serial->append(listForChartLINE2);//在serial中添加数据
serial->setName("DeltaTheta");
// chart->createDefaultAxes();
chart->addSeries(serial);//将数据加载到QChart中
axisX = new QValueAxis();//轴变量、数据系列变量,都不能声明为局部临时变量
axisY = new QValueAxis();//创建X/Y轴
axisX->setRange(0, Number_Size);
// axisY->setRange(MIN_D, MAX_D);//设置X/Y显示的区间Y_MINY_MAX
axisY->setRange(Y_MIN, Y_MAX);//设置X/Y显示的区间
chart->setAxisX(axisX);
chart->setAxisY(axisY);//设置chart的坐标轴
serial->attachAxis(axisY);
// serial
//连接数据集与坐标轴。特别注意:如果不连接,那么坐标轴和数据集的尺度就不相同,显示
//需要再次添加信号和槽
connectMarkers();
qDebug()<<"完成绘制";
}