动态曲线显示
动态曲线显示主要有横坐标轴为点和时间两种情况,横坐标轴为点时,有曲线动坐标轴固定和曲线动坐标轴随动两种情况;横坐标为时间时,曲线随时间动。
1.曲线动坐标轴固定
if(isVisible()){
QVector<QPointF>oldPoints1;
QVector<QPointF>points1;
oldPoints1=splineSeries1->pointsVector();
// qDebug()<<"oldPoints:"<<oldPoints.size();
int count = oldPoints1.size();
if(count < maxX){ //小于一个显示周期(180)时
for(int i=0; i<size; i=i+size){
oldPoints1.append(QPointF(count+i, data[box1->currentIndex()].at(count+i).y()));
}
if(stop1_flag){ //当按下暂停键时,绘图中止
splineSeries1->replace(oldPoints1);
}
}
else{//显示区域大于一个周期时
for(int k=size; k<count; ++k) //添加不足的点数
{
points1.append(QPointF(k-size , oldPoints1.at(k).y()));//坐标不变,数据前移size个单位,即移除最前方size个点数
}
qint64 sizePoints = points1.count(); //当前剩余点数oldpoints-size
for(int k=0; k<size; ++k) //添加size个点数
{
points1.append(QPointF(k+sizePoints,data[box1->currentIndex()].at(numberofcycle1%180 + k).y()));
}
if(stop1_flag){//控制曲线的移动与暂停
splineSeries1->replace(points1);
}
numberofcycle1 = numberofcycle1 + size; //控制新添加数据在一个周期数据中的位置
}
if(numberofcycle1 ==180){
numberofcycle1=0;//为避免数据过大,超过180则重置为零,因为坐标轴不动,所以重置为零不影响
}
}
2.曲线动坐标轴随动
if (event->timerId() == timerId) {
int size = pointcount; //刷新一次添加的点个个数,用于控制波形显示速度
if(Num_of_Channel2 != box2->currentIndex()){
splineSeries2->clear();
numberofcycle2=0;
}
Num_of_Channel2=box2->currentIndex(); //待显示的通道数
if(isVisible()){
QVector<QPointF>oldPoints2;
QVector<QPointF>points2;
oldPoints2=splineSeries2->pointsVector();
// qDebug()<<"oldPoints:"<<oldPoints.size();
int count2 = oldPoints2.size();
if(count2 < maxX){ //小于一个显示周期时
for(int i=0; i<size; i=i+size){
oldPoints2.append(QPointF(count2+i, data[Num_of_Channel2].at(count2+i).y()));
}
splineSeries2->replace(oldPoints2);
chart2->axisX()->setRange(0,180); //,低于一个周期时,设置X轴范围0-180
}
else{
for(int s=size;s<count2;++s) //将原数据整体前移size个
{
points2.append(QPointF(s-size+numberofcycle2,oldPoints2.at(s).y())); //替换数据用 移动数据用
}
qint64 sizePoints2 = points2.count(); //当前剩余点数oldpoints-size
for(int k=0;k<size;++k) //添加不足的点数
{
points2.append(QPointF(k+sizePoints2+numberofcycle2,data[Num_of_Channel2].at(numberofcycle2 % 180+k).y()));
}
if(stop2_flag){
splineSeries2->replace(points2);//控制曲线的显示与暂停
chart2->axisX()->setRange(numberofcycle2+size,numberofcycle2+size+179); //设置X轴范围
}
numberofcycle2=numberofcycle2+size; //控制新添加数据在一个周期数据中的位置
}
// qDebug()<<"numberofcycle:"<<numberofcycle2;
}
}
3.曲线随时间动
QDateTime currentTime = QDateTime::currentDateTime();
//设置坐标轴的线式范围
chart3->axisX()->setMin(QDateTime::currentDateTime().addMSecs(-180*1));
chart3->axisX()->setMax(QDateTime::currentDateTime().addMSecs(0));
//增加新的点到曲线末尾
double number = 0;
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
number = qrand()%99;
splineSeries3->append(currentTime.toMSecsSinceEpoch() , number);