最近在使用qcustomplot模块的时候,把setData 和 addData 这两个绘制线段函数做了下对比,
1: setData 在添加大量数据的时候 会卡咯,而且数据多的时候 它值添加整数的数据
如下图: 下面的图是addData()函数添加的数据,这个官方给的Demo就有。很简单。
一样的数据 使用setData()重绘后 成了下面的样子, 前面一点是使用addData 又重绘的线段
代码:
void MainWindow::on_start_pBt_clicked()
{
if(ui->start_pBt->text() == "开始")
{
ui->start_pBt->setText("暂停");
mflag.start_btn=1;
ui->customPlot->graph(0)->setData( x_tiaoshi, y_tiaoshi);
ui->customPlot->replot();
timer2->start();
}
else if(ui->start_pBt->text() == "暂停")
{
ui->start_pBt->setText("开始");
mflag.start_btn=0;
timer2->stop();
}
else
{
ui->start_pBt->setText("开始");
mflag.start_btn=0;
timer2->stop();
}
}
void MainWindow::updateData()
{
static double i=0;
static double x=0;
static double data = 0.0;
static QTime time(QTime::currentTime());
// calculate two new data points:
// double axis_x = time.elapsed()/1000.0; // time elapsed since start of demo, in seconds
static double lastPointKey = 0;
// ui->customPlot->graph(0)->getValueRange();
if( mflag.displayClearFlage == 0)
{ if(mflag.start_btn == 1)
{ double axis_x = time.elapsed()/1000.0; // time elapsed since start of demo, in seconds
// axis_x += 0.001 ;
x_tiaoshi[ axis_x ]=( axis_x ) ;
y_tiaoshi[ axis_x ]= qrand() % 100;
ui->customPlot->graph(0)->addData( x_tiaoshi[ axis_x ], y_tiaoshi[ axis_x ]);
void MainWindow::on_pushButton_5_clicked()
{
if( ui->pushButton_5->text() == "清屏")
{
timer2->stop();
mflag.displayClearFlage = 1;
for(int i =0;i<=100000;i++)
{
x_tiaoshi[i] = 0;
y_tiaoshi[i] = 0;
}
axis_x = 0;
ui->customPlot->graph(0)->setData( x_tiaoshi, y_tiaoshi);
ui->customPlot->replot();
// mflag.displayClearFlage = 0;
timer2->start();
}
}
之所以想使用setData 和addData一起混合使用,
1:addData()有几个弊端,就是用来做循环画线段的时候,最后一个点会和第一个点连接在一起,
2:使用Demo的代码,当不用时间轴做数据操作,画出来的线和实际的时间对不上,(数据量大的时候),我是用的1ms 定时中断一次,1ms 添加一个数据,不过这个数据的x轴 我这用的是0.001,估计也会卡,
对于qt 关于定时器的文章 前面写过一篇 , 一个新的工程 1ms 定时中断 和 100ms定时中断 和1s的定时中断,来做定时器,得出来的定时时间是不同的,1s的定时中断显示的定时是准确的,
。
这里得出来的结论是,数据量大的时候 和 你的x轴要使用小数的情况下 还是使用addData(), setData()在数据量大的时候 会直接舍弃小数x轴部分 直接取整数的值显示。