利用qwt自定义时间标尺TimeScale

2014年4月20日 由 Creater 留言 »

需要重载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));
广告位

评论已关闭.