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 | ||
) |
翻译过来是说:通过传入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;
最终显示效果如下: