欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qwt显示动态实时曲线

程序员文章站 2022-03-29 18:40:07
...

从传感器实时获取的数据,从串口上传到上位机,上位机由QT开发,上位机如何通过实时动态曲线方式进行展示呢?网上主要有两种方式:1、使用qwt;2、QCustomPlot;两者都差不多,QCustomPlot貌似更灵活漂亮点,但是由于qwt还有其他控件,这次的选择是qwt。

Java代码  Qwt显示动态实时曲线Qwt显示动态实时曲线
  1. /***************************************  
  2. 转载请注明出处:tedeum.iteye.com  
  3. ****************************************/    
    /*************************************** 
    转载请注明出处:tedeum.iteye.com 
    ****************************************/  

一、首先要定义和实例化一个QwtPlot,然后是一根曲线QwtPlotCurve,还有就是数据,由于QwtPlot是从设计器拉到界面,IDE做了这个工作就暂时不管了,如果没有IDE可以用代码写的:

Cpp代码  Qwt显示动态实时曲线Qwt显示动态实时曲线
  1. //曲线     
  2.  QwtPlotCurve * curve;  
  3. //X轴  
  4. double time[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};  
  5. //Y轴  
  6. double val[10] = {3, 5, 8, 7, 2, 0, 7, 9, 1};  
//曲线   
 QwtPlotCurve * curve;
//X轴
double time[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//Y轴
double val[10] = {3, 5, 8, 7, 2, 0, 7, 9, 1};

 二、接下来就是把这些东西组装起来:

Cpp代码  Qwt显示动态实时曲线Qwt显示动态实时曲线
  1. //实例化  
  2. curve = new QwtPlotCurve(“Acc_X”);  
  3. //加载数据  
  4. curve->setSamples(time, val, 10);  
  5. //加到plot,plot由IDE创建  
  6. curve->attach(ui->qwtPlot);  
     //实例化
     curve = new QwtPlotCurve("Acc_X");
     //加载数据
     curve->setSamples(time, val, 10);
     //加到plot,plot由IDE创建
     curve->attach(ui->qwtPlot);

 话不多说,一切尽在注释中,运行可以看见曲线绘制出来了:
Qwt显示动态实时曲线

图表显示出来,现在的问题是这是一个静态图标,如何动态显示实时数据呢,我们用定时器模拟产生随机数进行动态数据的展示,如下:

Cpp代码  Qwt显示动态实时曲线Qwt显示动态实时曲线
  1.      //启动定时器,1秒响应,用于模拟产生实时数据  
  2.      this->startTimer(1000);  
  3. //定时器事件  
  4. void MainWindow::timerEvent( QTimerEvent * ) {  
  5.     //所有数据前移移位,首位被覆盖  
  6.     for (int i = 0; i < 9; i++) {  
  7.         val[i] = val[i+1];  
  8.     }  
  9.     //最后一位为新数据(这里为随机数模拟)  
  10.     val[9] = qrand()%10;  
  11.     //重新加载数据  
  12.     curve->setSamples(time, val, 10);  
  13.     //QwtPlot重绘,重要,没有这句不起作用  
  14.     ui->qwtPlot->replot();  
  15.   
  16. }  
     //启动定时器,1秒响应,用于模拟产生实时数据
     this->startTimer(1000);
//定时器事件
void MainWindow::timerEvent( QTimerEvent * ) {
    //所有数据前移移位,首位被覆盖
    for (int i = 0; i < 9; i++) {
        val[i] = val[i+1];
    }
    //最后一位为新数据(这里为随机数模拟)
    val[9] = qrand()%10;
    //重新加载数据
    curve->setSamples(time, val, 10);
    //QwtPlot重绘,重要,没有这句不起作用
    ui->qwtPlot->replot();

}

 好了,到此为止可以动态显示实时曲线了:


Qwt显示动态实时曲线
 最后,还有一个问题当多条曲线共同显示的时候,如何隐藏显示曲线呢,比如加速度传感器的x、y、z共同显示,我只想看一条。可以通过点击图例在做到,好了还是看代码和注释:

Cpp代码  Qwt显示动态实时曲线Qwt显示动态实时曲线
  1.      //实例化图例  
  2.      QwtLegend *legend = new QwtLegend;  
  3.      //图例可以选择,Checkable  
  4.      legend->setDefaultItemMode( QwtLegendData::Checkable );  
  5.      //pwtPlot中插入图例  
  6.      ui->qwtPlot->insertLegend(legend, QwtPlot::LeftLegend );  
  7.      //连接槽,处理选择事件  
  8.      connect( legend, SIGNAL( checked( const QVariant &, boolint ) ),  
  9.          SLOT( legendChecked( const QVariant &, bool ) ) );  
  10. //图例选择事件  
  11. void MainWindow::legendChecked( const QVariant &itemInfo, bool on )  
  12. {  
  13.     //获取曲线  
  14.     QwtPlotItem *plotItem = ui->qwtPlot->infoToItem( itemInfo );  
  15.     //根据图例选择状态,设置曲线隐藏还是显示  
  16.     if ( plotItem )  
  17.         plotItem->setVisible(on);  
  18.     //重要,下面这句没有不起作用  
  19.     ui->qwtPlot->replot();  
  20. }  
     //实例化图例
     QwtLegend *legend = new QwtLegend;
     //图例可以选择,Checkable
     legend->setDefaultItemMode( QwtLegendData::Checkable );
     //pwtPlot中插入图例
     ui->qwtPlot->insertLegend(legend, QwtPlot::LeftLegend );
     //连接槽,处理选择事件
     connect( legend, SIGNAL( checked( const QVariant &, bool, int ) ),
         SLOT( legendChecked( const QVariant &, bool ) ) );
//图例选择事件
void MainWindow::legendChecked( const QVariant &itemInfo, bool on )
{
    //获取曲线
    QwtPlotItem *plotItem = ui->qwtPlot->infoToItem( itemInfo );
    //根据图例选择状态,设置曲线隐藏还是显示
    if ( plotItem )
        plotItem->setVisible(on);
    //重要,下面这句没有不起作用
    ui->qwtPlot->replot();
}

 好了,简单吧。qwt实时曲线显示的关键技术细节都在这里了:


Qwt显示动态实时曲线
 

Java代码  Qwt显示动态实时曲线Qwt显示动态实时曲线
  1. /***************************************  
  2. 转载请注明出处:tedeum.iteye.com  
  3. ****************************************/    
    /*************************************** 
    转载请注明出处:tedeum.iteye.com 
    ****************************************/  

 
 

转载自:http://tedeum.iteye.com/blog/2018706