Qwt之QwtPlotPicker及其扩展
来源:互联网 发布:开票软件启动不了 编辑:程序博客网 时间:2024/06/06 02:16
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(constQPointF&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('('+time.toString("yyyy-MM-dd HH:mm:ss:zzz")+')'); // 新增代码,将按照“年-月-日 时:分:秒:毫秒”的格式显示QDateTime默认不显示毫秒
}
return QwtText( text );
}
接着从Qwt中复制出toDateTime()方法的代码并进行修改。QDateTime PlotPickerByTime::toDateTime(doublevalue)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的效果
示例参见博文:http://blog.csdn.net/desert187/article/details/47780001
- Qwt之QwtPlotPicker及其扩展
- Qwt之QwtPlotPicker及其扩展
- QWT中QwtPlotPicker的介绍及使用
- Qwt扩展之-数据拾取
- QwtPlotPicker
- QwtPlotPicker
- Qwt使用之QwtPlot
- Qwt使用之QwtPlot
- Qwt使用之QwtPlot
- Qwt使用之QwtPlot
- Qwt之Plot
- QWT之QwtClipper 类
- QWT使用之QwtPlotCurve
- C#语法之{0:C}及其扩展
- 扩展欧几里得及其扩展
- QWT
- QWT
- qwt
- C语言中的ASCII、关键字和标识符的应用
- GC的分析与常用GC收集器
- iOS 给文字添加删除线
- JAVA基础知识——数组
- 【HLS】HTTP Live Streaming (HLS)
- Qwt之QwtPlotPicker及其扩展
- CSS的引入方式和书写规范
- php图片处理类【压缩、水印、裁剪、翻转】
- navicat导入sql文件时报错:mysql server has gone away
- 前言
- Android中检测当前是否为主线程
- git 的一些命令和错误
- Java并发性和多线程介绍目录
- java(2)