大麦,人人贷官网,聚胜哪个比较安全,谁投过?

VC动态曲线绘制_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
VC动态曲线绘制
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢RealtimeGraph 动态绘制曲线,给出历史数据显示及 Drawing 绘图程序 238万源代码下载-
&文件名称: RealtimeGraph
& & & & &&]
&&所属分类:
&&开发工具: Visual C++
&&文件大小: 183 KB
&&上传时间:
&&下载次数: 6
&&提 供 者:
&详细说明:动态绘制曲线,给出历史数据显示及实时动态曲线-Dynamic mapping curve, given historical data and real-time dynamic curves show
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&RealtimeGraph&&.............\ChildFrm.cpp&&.............\ChildFrm.h&&.............\ClassArr.h&&.............\ColorBtn.cpp&&.............\ColorBtn.h&&.............\Graphics.cpp&&.............\Graphics.h&&.............\MainFrm.cpp&&.............\MainFrm.h&&.............\msflexgrid.cpp&&.............\msflexgrid.h&&.............\OwnList.cpp&&.............\OwnList.h&&.............\Random.cpp&&.............\Random.h&&.............\ReadMe.txt&&.............\RealTime.cpp&&.............\RealTime.h&&.............\RES&&.............\resource.h&&.............\RES\RTDemo.ico&&.............\...\RTDemo.rc2&&.............\...\RTDemoDoc.ico&&.............\...\Toolbar.bmp&&.............\RTDemo.clw&&.............\RTDemo.cpp&&.............\RTDemo.dsp&&.............\RTDemo.dsw&&.............\RTDemo.h&&.............\RTDemo.ncb&&.............\RTDemo.opt&&.............\RTDemo.plg&&.............\RTDemo.rc&&.............\RTDemoDoc.cpp&&.............\RTDemoDoc.h&&.............\RTDemoView.cpp&&.............\RTDemoView.h&&.............\RTDlg.cpp&&.............\RTDLG.H&&.............\RTForm.cpp&&.............\RTForm.h&&.............\RTSlider.cpp&&.............\RTSlider.h&&.............\StdAfx.cpp&&.............\StdAfx.h&&.............\Str.cpp&&.............\Str.h&&.............\TimerSpeed.cpp&&.............\TimerSpeed.h
&相关搜索:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - 运用testTeeChart控件编程实现图形的静态和动态曲线显示
&[] - 多种绘制图形的方法,有实时曲线,历史数据,3D图形,饼状图等等
&[] - 能够实现动态绘制曲线的程序,里面包含了各种绘制曲线的类,很有参考价值
&[] - VC版绘图,直接在对话框中绘制曲线图,可以在二维与上位之间切换
&[] - 以数显百分表为对象,通过模拟数字和模拟显示界面,仿真位移监测。数显百分表是通过齿轮或杠杆将一般的直线位移(直线运动)转换成指针的旋转运动,然后在显示屏上进行读数的长度测量仪器。主要实现以下功能:串口通信、实时监控测量值、绘制动态曲线图、公英制转换、实时监控最大最小值显示、数据的读取与保存。
&[] - 燃气数据采集显示系统,支持报表、动态曲线图、仪表盘等功能。&>&&>&&>&&>&MFC动态绘制曲线图-HightSpeedChart实现
MFC动态绘制曲线图-HightSpeedChart实现
上传大小:241KB
文章地址:http://blog.csdn.net/czyt1988/article/details/
《绘图控件第五讲——绘制动态曲线》
介绍MFC常用绘图控件TeeChart和CChartCtrl绘制动态曲线的方法
综合评分:4.6(178位用户评分)
所需积分:0
下载次数:2494
审核通过送C币
创建者:csnd_ayo
创建者:xamhaha
创建者:qq
课程推荐相关知识库
上传者其他资源上传者专辑
开发技术热门标签
VIP会员动态
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
MFC动态绘制曲线图-HightSpeedChart实现
会员到期时间:
剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:下次自动登录
现在的位置:
& 综合 & 正文
如何绘制动态曲线
1 QWT绘制动态曲线
项目终于快完成了,现在开始整理下,总结下,今天先分享下关于使用如何用QWT绘制波形,先把图给贴出来。
以下源于百度百科“QWT全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目,可生成各种统计图。它为具有技术专业背景的提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式提供,输出方式可以是Curves(曲线),Slider(滚动条),Dials(圆盘),Compasses(仪表盘)等等。该工具库基于Qt开发,所以也继承了Qt的跨平台特性。”
我使用的是qwt-6.0.0-rc5,可以到官网下载,具体的安装和集成过程可以参照这个贴子。
“AdPlot.h”
1: #ifndef ADPLOT_H
2: #define ADPLOT_H
4: #include &QWidget&
5: #include &qwt_plot_curve.h&
6: #include &qfile.h&
7: #include &qwt_plot_magnifier.h&
9: namespace Ui {
10: class AdP
13: class AdPlot : public QWidget
15: Q_OBJECT
17: public:
18: explicit AdPlot(QWidget *parent = 0);
19: //要绘制的AD数据,X-时间,Y-电压值
20: void readAdData(QVector& double & &xData,
21: QVector& double & &yData);
22: void setTitleString(QString title);
23: void setTimerStop();
25: ~AdPlot();
26: public slots:
27: //节点打开的AD数据的文件名
28: void setFileName(QString filename);
29: //绘制AD数据
30: void plotAdCurve();
31: private:
32: Ui::AdPlot *
33: QwtPlotCurve *p_
34: QVector& double & xD
35: QVector& double & yD
36: QFile *localF
37: //文件偏移量
38: qint64
39: double
40: QString m_
41: QwtPlotMagnifier *PM;
42: //当前X轴最大的范围
43: int xMaxS
45: QTimer *adPlotT
47: QString m_
50: #endif // ADPLOT_H
头文件没什么好说的,说明一下offset这个变量,它是用来保存当前的读取到的文件位置,而xData和yData分别储存时间和电压值。
“AdPlot.cpp”
1: #include "adplot.h"
2: #include "ui_adplot.h"
3: #include &QtGui/QApplication&
4: #include &qapplication.h&
5: #include &qlayout.h&
6: #include &qlabel.h&
7: #include &qpainter.h&
8: #include &qwt_plot_layout.h&
9: #include &qwt_plot_curve.h&
10: #include &qwt_scale_draw.h&
11: #include &qwt_scale_widget.h&
12: #include &qwt_legend.h&
13: #include &qwt_legend_item.h&
14: #include &QTime&
15: #include &qtimer.h&
16: #include &QMessageBox&
17: #include &qcolor.h&
18: #include &qwt_plot_zoomer.h&
20: class TimeScaleDraw: public QwtScaleDraw
22: public:
23: TimeScaleDraw(const QTime &base):
24: baseTime(base)
28: virtual QwtText label(double v) const
30: QTime upTime = baseTime.addSecs((int)v);
31: return upTime.toString();
34: private:
35: QTime baseT
39: AdPlot::AdPlot(QWidget *parent) :
40: QWidget(parent),
41: ui(new Ui::AdPlot)
43: ui-&setupUi(this);
44: ui-&qwtPlot-&setAutoReplot(false);
45: QTime curT
46: curTime = curTime.currentTime();
50: QwtLegend *legend = new QwtL
51: legend-&setItemMode(QwtLegend::CheckableItem);
52: //ui-&qwtPlot-&insertLegend(legend, QwtPlot::RightLegend);
53: ui-&qwtPlot-&setAxisTitle(QwtPlot::xBottom, " System Uptime [h:m:s]");
54: ui-&qwtPlot-&setAxisScaleDraw(QwtPlot::xBottom,
55: new TimeScaleDraw(curTime));
56: ui-&qwtPlot-&setAxisScale(QwtPlot::xBottom, 0, xMaxScale = 5);
57: ui-&qwtPlot-&setAxisLabelAlignment(QwtPlot::xBottom, Qt::AlignLeft | Qt::AlignBottom);
59: QwtScaleWidget *scaleWidget = ui-&qwtPlot-&axisWidget(QwtPlot::xBottom);
60: const int fmh = QFontMetrics(scaleWidget-&font()).height();
61: scaleWidget-&setMinBorderDist(0, fmh / 2);
63: ui-&qwtPlot-&setAxisTitle(QwtPlot::yLeft, "V");
64: ui-&qwtPlot-&setAxisScale(QwtPlot::yLeft, 0, 3);
65: p_adplot = new QwtPlotCurve();
66: QColor c = Qt::
67: c.setAlpha(150);
68: p_adplot-&setPen(c);
70: p_adplot-&attach(ui-&qwtPlot);
71: //PM = new QwtPlotMagnifier(ui-&qwtPlot-&canvas());
72: QwtPlotZoomer* zoomer = new QwtPlotZoomer( ui-&qwtPlot-&canvas() );
73: zoomer-&setRubberBandPen( QColor( Qt::black ) );
74: zoomer-&setTrackerPen( QColor( Qt::black ) );
75: zoomer-&setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlModifier );
76: zoomer-&setMousePattern(QwtEventPattern::MouseSelect3,Qt::RightButton );
77: time = 0.0;
78: adPlotTimer = new QTimer();
79: adPlotTimer-&start(100);
80: connect(adPlotTimer, SIGNAL(timeout()),
81: this, SLOT(plotAdCurve()));
82: offset = 0;
85: AdPlot::~AdPlot()
87: delete
90: void AdPlot::readAdData(QVector&double& &xData, QVector&double& &yData)
92: if(!m_filename.isEmpty())
94: localFile = new QFile(m_filename); //用户端的IP地址+端口号作为文件名
95: if (!localFile-&open(QFile::ReadOnly ))
97: QMessageBox::warning(0, tr("应用程序"),
98: tr("无法读取文件 %1:\n%2.")
99: .arg(m_filename)
100: .arg(localFile-&errorString()));
101: return;
103: QByteArray adD
104: if (!localFile-&atEnd())
106: if (offset == 0)
108: adData = localFile-&read(26);
109: qDebug()&&adD
110: offset += 26;
111: adData.resize(0);
112: return;
115: if (localFile-&seek(offset))
118: adData = localFile-&read(32*2);
119: if (adData.count() == 32*2)
121: for (int count=0; count&32; count++)
123: char lowbits = adData.at(count*2);
124: char highbits = adData.at(count*2 + 1);
125: short temp = lowbits+highbits*256;
126: yData.append(((float)temp)*00);
127: xData.append(time);
128: time += 0.005; //5ms一个数据
130: offset += 32*2;
138: void AdPlot::plotAdCurve()
140: readAdData(xData,yData);
141: p_adplot-&setSamples(xData,yData);
142: if (!xData.empty())
144: if (xData.last() &= xMaxScale)
146: xMaxScale *= 2;
147: ui-&qwtPlot-&setAxisScale(QwtPlot::xBottom, 0, xMaxScale);
150: p_adplot-&attach(ui-&qwtPlot);
151: ui-&qwtPlot-&replot();
152: adPlotTimer-&start(100);
157: void AdPlot::setFileName(QString filename)
159: m_filename =
162: void AdPlot::setTitleString(QString title)
164: m_title =
165: ui-&qwtPlot-&setTitle(m_title);
168: void AdPlot::setTimerStop()
170: adPlotTimer-&stop();
说一下TimeScaleDraw这个类,它继承了QwtScaleDraw的类,其实就是一个抽象的一个刻度类,具体的函数说明可以参考说明手册.
对了,ui界面里没什么东西,就一个qwtplot的控件.
接着初始化坐标轴:
(int axisId, const QString &) 用来设置坐标轴名字,第一个参数是QWT定义的坐标轴ID,即yLeft,yRight,xBottom和xTop.
(int axisId,
*)用来设置坐标轴刻度,第一个参数同上,第二个参数就是我们刚才定义的TimeScaleD
(int axisId, double min, double max, double step=0)也是设置刻度的,第一个参数同上,第二参数是刻度的最小值,第三个参数是刻度的最大值,最后一个是步长.
然后定义一个曲线QwtPlotCurve:
QwtPlotCurve,它的功能就是输入一系列的X,Y的值,然后绘制出曲线,当然,曲线的color,style那些是可以自己设置的.
缩放曲线(PS:这点就体现了QWT的强大之处):
QwtPlotZoomer,简单的一个类,简单的只个设置就可以缩放曲线,谁用谁知道啊.
定时器完成曲线的重绘:
adPlotTimer = new QTimer();
adPlotTimer-&start(100);
connect(adPlotTimer, SIGNAL(timeout()), this, SLOT(plotAdCurve()));
因为所用的AD是400K的,算了一下,大概160ms以下就能满足了.
读取AD数据:
因为服务器接收到的AD数据是保存在文件中的,而且是实时保存(也就是将Client接收的数据保存到文件的同时将此文件中的数据绘制出来).所以设置了一个文件偏移量,而已此文件的前26字节是采集的时间信息,所以跳过.
又因为用的是AD是12位的,Client采用一个short类型来保存数据,而已每次传输32个AD数据,所以在计算AD数据前要确保文件已经有了32个AD数据,即64字节的数据.
绘制AD数据:
(const QVector& double & &xData, const QVector&
double & &yData)完成数据的设置.
此函数重点在于时间轴的拉长:
if (xData.last() &= xMaxScale)
xMaxScale *= 2;
ui-&qwtPlot-&setAxisScale(QwtPlot::xBottom, 0, xMaxScale);
qwt的确一个优秀的第三方库,使用也不复杂,而已有详细的文档说明,还有很多例子,不过都是英文的,慢慢看吧.
转;.cn/s/blog_7cb9d2f90100rr9v.html
==================================================================================
从传感器实时获取的数据,从串口上传到上位机,上位机由QT开发,上位机如何通过实时动态曲线方式进行展示呢?网上主要有两种方式:1、使用qwt;2、QCustomPlot;两者都差不多,QCustomPlot貌似更灵活漂亮点,但是由于qwt还有其他控件,这次的选择是qwt。
一、首先要定义和实例化一个QwtPlot,然后是一根曲线QwtPlotCurve,还有就是数据,由于QwtPlot是从设计器拉到界面,IDE做了这个工作就暂时不管了,如果没有IDE可以用代码写的:
QwtPlotCurve *
double time[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
double val[10] = {3, 5, 8, 7, 2, 0, 7, 9, 1};
二、接下来就是把这些东西组装起来:
curve = new QwtPlotCurve("Acc_X");
curve-&setSamples(time, val, 10);
curve-&attach(ui-&qwtPlot);
话不多说,一切尽在注释中,运行可以看见曲线绘制出来了:
图表显示出来,现在的问题是这是一个静态图标,如何动态显示实时数据呢,我们用定时器模拟产生随机数进行动态数据的展示,如下:
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);
ui-&qwtPlot-&replot();
好了,到此为止可以动态显示实时曲线了:
最后,还有一个问题当多条曲线共同显示的时候,如何隐藏显示曲线呢,比如加速度传感器的x、y、z共同显示,我只想看一条。可以通过点击图例在做到,好了还是看代码和注释:
QwtLegend *legend = new QwtL
legend-&setDefaultItemMode( QwtLegendData::Checkable );
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实时曲线显示的关键技术细节都在这里了:
转:/blog/2018706
==================================================================
在工控监测领域,经常需要动态绘制曲线,观察曲线的变化趋势,绘制波形图,绘制频谱等。在前面4讲中介绍了MFC经常用的控件和 Ctrl,这两个都是MFC绘图控件的经典(另外,在Qt中还有和两大神器)。许多人问如何绘制动态变化的曲线,为此专门写下这篇。
C++ GUI 绘图控件目录
对于任何绘图控件,都可以实现动态绘图,其原则是:控件只负责绘图,若想曲线动,就让数据动,就像看电影一样,电影是由一帧一帧的静态图片组合起来的,在一定速度上刷新,静态图片就能动起来;和电影的原理一样,绘图控件能显示静态的曲线,想要它动起来,就让它频在一定时间刷新就可以了。
这就是动态绘图的实现原理。
实现动态曲线需要以下两个准备:
计时器Timer
基于Timer的绘图
任何界面库都会有Timer这个实现,在MFC中时OnTimer消息,在Qt中是QTimer类,那种原理基本都一样,下面将以MFC为例进行说明。
Timer是消息级别最低的消息,它会保证其它级别高的消息优先执行,因此,就算数据大量刷新,也不会影响主线程的其它消息。
MFC生成OnTimer消息,消息响应函数如下:
绘图的实现就在这个消息响应函数里
如果让定时器设定为1秒触发,每一秒把旧数据去除,绘制新数据,就能看到不停变换的波形;对于趋势图,假如每秒有一个新数据,那么就在定长数组中,把数组所有数据整体左移,同时数组末端加入新数据。代码如下:
此函数把整个数组左移,然后新数据放置在数组最末端(右端)。
这样,数组就实现“向左运动”,把左移后的数组绘制,就能在绘图控件上发现其变化。
下面开始实现动态绘图(这里演示的方法,附件里有的方法):
函数中几个成员变量的定义是:
m_TeeChartArray是需要绘制的数组的Y值,m_X是对应的x值,m_count是计数器,每绘制一次,个数加1,主要用于x轴
在timer中的实现如下:
drawMoving函数用于绘图,timer设定为1秒触发一次,这时就能看到每秒的变化,如果数据是以1秒为刷新周期,每一秒有个新数据,只需要把旧的数据向左移,新数据放到数组最右端,再在绘图控件上把此图形画出来即可看的像动一样。
drawMoving函数的实现如下:
前面说过timer是优先级最低的消息,如果想曲线动的流畅,可以把时钟设置为0ms,如
这时会在保证界面流畅的前提下,以最高频率刷新。这样看到的图形会非常流畅。
上面介绍的就是动态绘制曲线的思路和方法,附件中有用TeeChart实现和HightSpeedChart实现的例子,考虑到可能有些人没有安装TeeChart,专门把TeeChart分离出来了一个源码,只有HightSpeedChart,不需要安装任何控件。
demo2(不用安装任何控件):
转;http://blog.csdn.net/czyt1988/article/details/
&&&&推荐文章:
【上篇】【下篇】&&&您需要以后才能回答,未注册用户请先。

我要回帖

更多关于 人人贷 的文章

 

随机推荐