Qwt之QwtDateScaleDraw时间标尺

来源:互联网 发布:手机淘宝尺码怎么设置 编辑:程序博客网 时间:2024/05/16 09:33

原文地址:http://blog.csdn.net/desert187/article/details/12849133

Qwt是用于绘制科学图形的Qt库。其中用于绘制坐标和曲线的类是QwtPlot类。QwtPlot提供的坐标默认以数值为单位,例如:(1,2,3,…,61,62…)。但是有些时候需要以时间或日期为单位刻度的标尺。Qwt是提供了这样的功能的。
QwtPlot类会默认创建两个Scale,也就是标尺,另外QwtPlot提供了方法,允许开发人员对将默认的Scale替换成定制的标尺。因此,只需要创建一个QwtDateScaleDraw对象QwtDateScaleDraw是以时间为刻度的标尺类,并用其替换Plot的默认Scale即可。QwtDateScaleDraw类的继承关系如下所示:
这里写图片描述
替换Plot的默认Scale代码如下:

QwtDateScaleDraw *timeScale = new QwtDateScaleDraw(Qt::LocalTime);QwtPlot *plot = new QwtPlot();plot->setAxisScaleDraw(QwtPlot::xBottom, timeScale);delete plot; 

Qwt帮助文档中setAxisScaleDraw()方法的原型和解释如下:

void QwtPlot::setAxisScaleDraw  (int axisId, QwtScaleDraw *scaleDraw);

By passing scaleDraw it is possible to extend QwtScaleDrawfunctionality and let it take place in QwtPlot. Please note that scaleDraw has to be created with new and will be deleted by the corresponding QwtScale member ( like a child object ).
翻译过来是说:通过传入scaleDraw参数,可以替代QwtPlot中的QwtScaleDraw,并扩展其功能。请注意,scaleDraw必须使用new关键字创建,作为相关的QwtScale成员,会被像子对象一样删除(笔者注:Qt会自动delete子对象)。
这就是在上述代码中,只需要delete plot,而不用再delete timeScale了。
QwtDateScaleDraw允许开发人员对时间刻度的显示方式进行设置,下面的代码将设置在毫秒级别以“Sec 秒:毫秒”的方式显示,在秒及其以上级别以“时:分:秒\n年-月-日”的方式进行显示,其中“\n”表示换行。

QString *scaleFormat;scaleFormat = new QString("Sec ss:zzz");timeScale->setDateFormat(QwtDate::Millisecond, *scaleFormat);delete scaleFormat;scaleFormat = new QString("hh:mm:ss\nyy-MM-dd");timeScale->setDateFormat(QwtDate::Second, *scaleFormat);delete scaleFormat;

最终显示效果如下:
这里写图片描述

附另有一个帖子的自定义日期/时间标尺的实现代码:
原帖地址:http://bbs.csdn.net/topics/391053905?page=1

//时间坐标轴class TimeScakeDrawR: public QwtScaleDraw{public:TimeScakeDrawR(const QDateTime &base):  baseTime(base){  }virtual QwtText label(double v) const{QDateTime upTime = baseTime.addSecs((int )v);return upTime.toString("yyyy-MM-dd\nhh:mm:ss");}private:QDateTime baseTime;};//调用:m_baseTime = QDateTime::currentDateTime();ui.qwtPlot->setAxisScaleDraw(QwtPlot::xBottom,new TimeScakeDrawR(m_baseTime));
0 2
原创粉丝点击