QWT中QwtPlotPicker的介绍及使用

QWT中QwtPlotPicker的介绍及使⽤
Qwt是⽤于绘制科学图形的Qt库。Qwt中的Picker是⼀个拾取器,通俗的说就是⽤户的⿏标指到哪⾥就获得哪⾥的信息(往往是x,y坐标)。QwtPicker类所获得的坐标信息是依赖于窗⼝的。⽽在Qwt中,⽤户所见的科学坐标系是绘制在Plot上的。Plot坐标与窗⼝坐标相⽐,不但原点位置不同,⽽且⽅向也不⼀定相同(见图1)。但是Plot坐标与窗⼝坐标是有⼀定相对关系的,为此,Qwt提供了QwtPlotPicker来获取Plot坐标信息。
图1.Plot坐标与窗⼝坐标
QwtPicker以及QwtPlotPicker的继承、派⽣关系如图2所⽰。
图2.QwtPlotPicker的继承、派⽣关系
QwtPlotPicker能够获得Plot中的坐标并通过跟随于⿏标的Label显⽰出来,但是这个坐标是以原点为起点来显⽰的,例如:
(100.1,50.9)这样的数字表⽰相对于原点的⼀个点。这在Plot的坐标的是数值型的时候还是⽐较给⼒的。但是Plot坐标可以为⽇期型的,例如:(2013-10-18 星期五 9:06:15:666),并且这个时间是CTU(Coordinated Universal Time)时间,也就是从1970年1⽉1⽇
鼠标跟随8:00:00:000开始计时的,。这个时候,QwtPlotPicker所获得的坐标表⽰以CTU时间为起点的毫秒数,⽆疑这个数值是很⼤的。那能否让Picker与Plot的坐标⼀样,让紧跟⿏标的Label以⽇期格式显⽰出来
呢?
这就要编写⼀个类来继承QwtPlot类。所幸的是Qwt是⼀个开源的项⽬,只要将QwtPlotPicker类复制出来改写为⾃⼰的类即可。新类命名为“PlotPickerByTime”,除了对应的类名要修改外,其余要修改的地⽅⾮常少。
主要修改的是PlotPickerByTime中的trackerTextF()⽅法,该⽅法⽤于获得紧跟⿏标的Label中所显⽰的⽂本(Text)。这是⼀个protected virtual⽅法,因此也可以派⽣QwtPlotPicker类,并重写该虚函数。新的trackerTextF()代码如下:
QwtText PlotPickerByTime::trackerTextF(const QPointF&pos)const
{
QString text;
QDateTime time=toDateTime(double(pos.x()));
switch(rubberBand())
{
case HLineRubberBand:
text.sprintf("%.4f",pos.y());    //此处笔者没有使⽤,没有修改,建议根据⾃⼰需求进⾏修改
break;
case VLineRubberBand:
text.sprintf("%.4f",pos.x());    //此处笔者没有使⽤,没有修改,建议根据⾃⼰需求进⾏修改
break;
default:
//text.sprintf("%.4f,%.4f",pos.x(),pos.y());    // 原代码
text.append(QString::number(pos.y(),'f',2));        // 新增代码
text.append('('+String("yyyy-MM-dd HH:mm:ss:zzz")+')');    // 新增代码,将按照“年-⽉-⽇时:分:秒:毫秒”的格式显⽰QDateTime默认不显⽰毫秒
}
return QwtText(text);
}
接着从Qwt中复制出toDateTime()⽅法的代码并进⾏修改。
tt27.tvQDateTime PlotPickerByTime::toDateTime(double value)const
{
// 注意以下代码中对应部分修改成了Qt::LocalTime,使⽤时应根据⾃⼰需要进⾏修改
QDateTime dt=QwtDate::toDateTime(value,Qt::LocalTime);
if(!dt.isValid())
{
const QDate date=(value<=0.0)
?QwtDate::minDate():QwtDate::maxDate();
dt=QDateTime(date,QTime(0,0),Qt::LocalTime);
}
// 注释掉以下原始代码,如果使⽤到Qt::OffsetFromUTC类型,则不可以简单注释,⽽需对下⾯代码进⾏修改/*if(d_data->timeSpec==Qt::OffsetFromUTC)
{
dt=dt.addSecs(d_data->utcOffset);
dt.setUtcOffset(d_data->utcOffset);
伦琴射线管
}*/
return dt;
}
这样最终显⽰的效果便如图3所⽰。
图3.PlotPickerByTime的效果
---------------------------------------------------------------------------------------------------------------------------------Qw
tPlotPicker  继承 QwtPicker
QwtPicker的核⼼有三个:
1、Tracker
2、StateMachine
3、RubberBand
简单来说tracker就是在⿏标光标处显⽰当前坐标。
rubberBand则与stateMachine有关了。 rubberBand有很多种:
Enumerator:
NoRubberBand No rubberband.
HLineRubberBand    A horizontal line ( only for QwtPicker::PointSelection )
VLineRubberBand    A vertical line ( only for QwtPicker::PointSelection )
CrossRubberBand    A crosshair ( only for QwtPicker::PointSelection )
RectRubberBand    A rectangle ( only for QwtPicker::RectSelection )
EllipseRubberBand An ellipse ( only for QwtPicker::RectSelection )
PolygonRubberBand    A polygon ( only for ::&PolygonSelection )
UserRubberBand Values >= UserRubberBand can be used to define additional rubber bands.
但是必须与下⾯的machine对应,
跨栏架filters all enter, leave, mouse and keyboard events of a widget and translates them into an array of selected points.
蝶形螺丝
The way how the points are collected depends on type of state machine that is connected to the picker. Qwt offers a couple of predefined state machines for selecting: Nothing
Single points
,
Rectangles
,
Polygons
While these state machines cover the most common ways to collect points it is also possible to implement individual machines as well.速冻隧道

本文发布于:2024-09-22 13:39:56,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/339764.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:坐标   修改   代码   获得
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议