Qt绘图 使用QWT绘制科学图表、绘图.docx
QWt是一个基于1.GP1.版权协议的开派项目,其目标是供应组2D的囱体库显示技术领域的数据.数抠源以浮点数组或范围的方式供血,珀出方式可以是CUrVeS(曲线),Slider(滚动条),DiaIS(圆盘),8mpasses(仪去盘)等等。该工具库菸于CH开发,所以也绢承了Qt的跨平台特性,据原作者文档所说,该项目在Qt-winO-x11/QbembeddedIqVfb环境)上都测试过,运行正常.项目的主页在:在网上搜了一下,发觉关于qwt的中文资料实在很少,基本上只有关于漏谛和安装的文章.事实上经过笔者实践.QWt的编译和运行实在乏善可陈,qmakamake就可以搞定.没什么可mem。的东西,所以这篇文章将以扫白为主,介绍QWt的feature当然根据正常的依次,我们还是从编译安装起先”从SVn服务器上下我最新代码:SVneo进入qwtH日,运行你电脑上qt4对应的qmake,再运行make编译,如笔者环境中是Scdqwt$exportPATH=usrlocal,TrolltechlQt4.5.1.'bin/:SPATH$qmake$make编译要花个几分钟的时间,胜利后在Iib不会生成IigwtSO文件,并且examples也参加编译,生成的binary在exampesin下,我们可以运行这些例子初步杳石qwt的功能,SeXPOrt1.D_UBRARY_PATH=$PWDmbSCdexamples''bin$./simpleSimPle是qwt自带的例子中最简洁的一个,一共只有一百来行的代码,实现了数学中的正弦函数(Sino)和余弦函数(8S()曲线.如下图:这个例子里用到的核心类彳了四个(以下内容是他者的理斛,有可能彳j不对的地方,清酌情阅读):OwtPIot类似一个2D绘图的容涔,里面可以放及他的QWlPIoMem派生类对象,比如本例f中运用的QwtPIotMarker格<有点类似Qt里的graphicsview的第觉,)这个类仪设限制绘图数据的产生和传递,并且绘制一个眼标轴。OwtPIotMarker标尺类,用于绘制刻度税.QwtPIotCurve曲线类,用于绘制各种曲戏.QwtSyntheticPointData比较惊奇,这是个undocumented的突,估计不当心被作者遗混了,文档中没书供应该类的说明,只能从海码中找寻答案了,这一点很让人郁闷,通过看code3中的注释和例子代码,笔者的理解是该类负费产生数据,它的作用是供应固定故城的浮点数的点,点的数I止在构造类时传入.获"数据时QwtPlotCurve类会调用该类的y()方法获得纵坐标“程序的基本流程是:1、初始化绘图容器,设置坐标轴的参数USetaxesSetAXiSTrtlexBottom."x->'):setAxisScale(xBottom,0.0.10.0)H横坐标从0到10.XBottom衣示横坐标的方向从卜往上setAxisTitle(y1.ft,*y->");setAxisScae(y1.ft,-i.,1O);纵坐标一1到1.y1.efl我示纵坐标的方向从左到右2、潦加正弦余弦曲线UInsertnewcurvesQwtPIotCurve,cSin=newQwtPlotCurve("y=sin(×)");#ifQT_VERSION>=0×040000cSin->setRenderHint(QwtPlotltem::RenderAntialiased);#endifCSin->setPen(QPen(Qt:red);/红色llll线cSi>attach(this);QvrtPIotCurve*cCos=newQwtPlotCurve('y=s(x)"):#ifQT,VERSION>=0×040000cCos->setRerxirHint(QwtPlotitem:RenderAntiaIiaSed);#endifCCOS->setPen(QPen(Qt:blue)y/收色曲线cCos->a11ach(this);3、设置曲线的数据内容UCreatesinandcosdatacSin->setData(Funct>onData(:sin);cCos->setData(FunctionData(:cos);4、添加横纵标尺级作为坐标的参照/InsertmarkersU.ahorizontallineaty=O.QwtPIOtMarker,mY=newQwtPIotMarkerO;mY->set1.abel(QString:from1.atin1("y=O*);mY->set1.abelAlignment(Qt:AlignRight|Qt:AlignTop);mY->set1.ineStyle(QwtPlotMarker:HiJne)*般的方向mY>sYValue(O.O)y/标尺线住在y=0的位置mY->attach(this);H.averticallineatx=2,piQvztPIotMarker,m×-newQwtPIotMarkerO;mX->set1.abel(QString:from1.atin1("x=2pi"):mX->set1.ablAlignmnt(Qt:IAIign1.eftQt"AlignBottom);mX->sei1.abelOrientation(Qt:Vertical);mX->set1.ineStyle(QwtPIotMarkeriiV1.ine):mX->set1.inePen(QPen(Qt:black.O,QtQashDot1.ine);mX->setXValu(2.0,M_PI)W该标线画在x-2PI的位置m×->attach(this);同样的功能假如用Qt来写的话须要号大量的绘图代码,比较麻烦,但运用QWl的封装库代码更00I1.更简洁理解和维护,在这个例了中运用Qwt的优势体现得可能还不太明显,相比而言图难,些的图表更能体现QWt的优超性。再来几个例子的裁图:Xbode,v*×ZmPMtMGDampingFactor0仝会FrequencyResponseofaSecond-OrderSystemlpipn±一dEVAmplitudePhaseCursorPos:PressleftmousebuttonInplotregion怎么样,这几个例子还是满炫的吧?总的来说这个库的好用性还是比较强的,值得试.有爱好的同学不妨也下载卜来自己玩一玩。