笔记Qwt显示动态实时曲线
2016-05-20 08:12
501 查看
https://www.baidu.com/s?ie=UTF-8&wd=%E7%AC%94%E8%AE%B0qwt%E6%98%BE%E7%A4%BA%E5%8A%A8%E6%80%81%E5%AE%9E%E6%97%B6%E6%9B%B2%E7%BA%BF
从传感器实时获取的数据,从串口上传到上位机,上位机由QT开发,上位机如何通过实时动态曲线方式进行展示呢?网上主要有两种方式:1、使用qwt;2、QCustomPlot;两者都差不多,QCustomPlot貌似更灵活漂亮点,但是由于qwt还有其他控件,这次的选择是qwt。
Java代码
/***************************************
转载请注明出处:tedeum.iteye.com
****************************************/
一、首先要定义和实例化一个QwtPlot,然后是一根曲线QwtPlotCurve,还有就是数据,由于QwtPlot是从设计器拉到界面,IDE做了这个工作就暂时不管了,如果没有IDE可以用代码写的:
Cpp代码
//曲线
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代码
//实例化
curve = new QwtPlotCurve("Acc_X");
//加载数据
curve->setSamples(time, val, 10);
//加到plot,plot由IDE创建
curve->attach(ui->qwtPlot);
话不多说,一切尽在注释中,运行可以看见曲线绘制出来了:
图表显示出来,现在的问题是这是一个静态图标,如何动态显示实时数据呢,我们用定时器模拟产生随机数进行动态数据的展示,如下:
Cpp代码
//启动定时器,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();
}
好了,到此为止可以动态显示实时曲线了:
最后,还有一个问题当多条曲线共同显示的时候,如何隐藏显示曲线呢,比如加速度传感器的x、y、z共同显示,我只想看一条。可以通过点击图例在做到,好了还是看代码和注释:
Cpp代码
//实例化图例
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实时曲线显示的关键技术细节都在这里了:
Java代码
/***************************************
转载请注明出处:tedeum.iteye.com
****************************************/
从传感器实时获取的数据,从串口上传到上位机,上位机由QT开发,上位机如何通过实时动态曲线方式进行展示呢?网上主要有两种方式:1、使用qwt;2、QCustomPlot;两者都差不多,QCustomPlot貌似更灵活漂亮点,但是由于qwt还有其他控件,这次的选择是qwt。
Java代码
/***************************************
转载请注明出处:tedeum.iteye.com
****************************************/
一、首先要定义和实例化一个QwtPlot,然后是一根曲线QwtPlotCurve,还有就是数据,由于QwtPlot是从设计器拉到界面,IDE做了这个工作就暂时不管了,如果没有IDE可以用代码写的:
Cpp代码
//曲线
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代码
//实例化
curve = new QwtPlotCurve("Acc_X");
//加载数据
curve->setSamples(time, val, 10);
//加到plot,plot由IDE创建
curve->attach(ui->qwtPlot);
话不多说,一切尽在注释中,运行可以看见曲线绘制出来了:
图表显示出来,现在的问题是这是一个静态图标,如何动态显示实时数据呢,我们用定时器模拟产生随机数进行动态数据的展示,如下:
Cpp代码
//启动定时器,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();
}
好了,到此为止可以动态显示实时曲线了:
最后,还有一个问题当多条曲线共同显示的时候,如何隐藏显示曲线呢,比如加速度传感器的x、y、z共同显示,我只想看一条。可以通过点击图例在做到,好了还是看代码和注释:
Cpp代码
//实例化图例
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实时曲线显示的关键技术细节都在这里了:
Java代码
/***************************************
转载请注明出处:tedeum.iteye.com
****************************************/
相关文章推荐
- initialization failure:0×0000000c错误以及软件无法正常启动解决
- Java设计模式(二) 工厂方法模式
- 哈佛——教育
- 心灵鸡汤之20160520适可而止
- 【bzoj4568】[Scoi2016]幸运数字 线性基+树链剖分
- 国家的强大——小学教师
- Java设计模式(四) 观察者模式
- linux-find搜索指令详解
- 实时视频流
- JavaScript函数
- 基本TCP套接字编程
- BZOJ 4568 [Scoi2016]幸运数字
- 如何用Web技术开发Windows Form应用
- [Android Studio 1A] – 插件
- Oracle 存储单位 m³ 存成m3的解决办法
- React-native 关于 android真机解决出现连不上服务器
- Python fabric实践操作
- 一看就懂的设计模式(三 ,外观模式)
- 使用Fabric自动化你的任务
- (Shadow Mapping) 阴影映射原理与实现