• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    4年前 (2014-04-20)  qwt 评论关闭  28 
    文章评分 0 次,平均分 0.0

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

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/3366.html

    关于
    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享