zoukankan      html  css  js  c++  java
  • qwt自定义时间标尺TimeScale

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

  • 相关阅读:
    前台线程与后台线程,AfxGetApp>GetMainWnd()与AfxGetMainWnd的不同 (转)
    详细解说 STL 排序(Sort) (转)
    (转)怎样从一个DLL中导出一个C++类
    HTTP协议之状态码详解(转)
    关于列表(ListCtrl)控件的界面基础知识
    C++序列化(转)
    vs2008修改Menu(菜单)资源ID的方法。
    怎样解决VC中滚动条最大滚动值不能超过32767的问题
    < Photoshop CS 专栏 >颜色(二)
    C#使用BinaryReader类读取二进制文件
  • 原文地址:https://www.cnblogs.com/oceanking/p/2683315.html
Copyright © 2011-2022 走看看