需要重載QwtScaleDraw類的virtual QwtText label(double)const;方法
該方法在需要繪制scale label時會調用。
主要思路是標尺上的點對應QDateTime::toTime_t()的值。然后重載label方法,在QwtText label(double v) const 方法中將參數v轉化為QDateTime對象,再轉為QString。
timescaledraw.h
#ifndef TIMESCALEDRAW_H #define TIMESCALEDRAW_H #include <qwt_scale_draw.h> #include <QDateTime> class TimeScaleDraw : public QwtScaleDraw {public: TimeScaleDraw(); virtual QwtText label(double) const; }; #endif // TIMESCALEDRAW_H
timescaledraw.cpp
#include "timescaledraw.h" TimeScaleDraw::TimeScaleDraw() { } QwtText TimeScaleDraw::label(double v) const { QDateTime datetime;datetime.setTime_t((uint)v);
return QwtText(datetime.date().toString(Qt::ISODate); }
調用方法:
qwtplot->setAxisScaleDraw(QwtPlot::xBottom, new TimeScaleDraw());
-------------------------------------------------------
實現之后發現一個問題,就是當qwt標尺的label在左右兩端顯示時,會把標尺撐得變形。可以利用重載的label方法判斷在左右兩端附近時返回一個空的QwtText即可。
具體代碼如下:
timescaledraw.h
#ifndef TIMESCALEDRAW_H #define TIMESCALEDRAW_H #include <qwt_scale_draw.h> #include <QDateTime> class TimeScaleDraw : public QwtScaleDraw {
double minLabelPos, maxLabelPos; public: TimeScaleDraw(const double minLabelPos, const double maxLabelPos); virtual QwtText label(double) const; void myinit(const double minLabelPos, const double maxLabelPos); }; #endif // TIMESCALEDRAW_H
timescaledraw.cpp
#include "timescaledraw.h" TimeScaleDraw::TimeScaleDraw(const double minLabelPos, const double maxLabelPos) {
myinit(minLabelPos, maxLabelPos); } QwtText TimeScaleDraw::label(double v) const { QDateTime datetime; if(v < minLabelPos || v > maxLabelPos) return QwtText(); datetime.setTime_t((uint)v);return QwtText(datetime.date().toString(Qt::ISODate); } void TimeScaleDraw::myinit(const double minLabelPos, const double maxLabelPos) {
this->minLabelPos = minLabelPos; this->maxLabelPos = maxLabelPos; }
調用方法:
qwtplot->setAxisScaleDraw(QwtPlot::xBottom, new TimeScaleDraw(xx, xxxx));