qwt отображение по оси абсцисс даты времени

В .log пишу состояние сенсора. Запись произвожу раз в час, то есть дискрет между точками равен 60 минутам. Запись циклическая с периодом 1 год. Вот и возникает вопрос как можно в qwt по оси абсцисс отобразить время вместо точек дискретизации? Для удобства чтения данных.


Ответы (1 шт):

Автор решения: Fat-Zer

Начиная с Qwt 6.1 можно использовать QwtDateScaleDraw и, по необходимости, QwtDateScaleEngine.


Пример на основе simpleplot:

#include <cstdlib>

#include <qapplication.h>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>
#include <qwt_plot_grid.h>
#include <qwt_symbol.h>
#include <qwt_legend.h>

#include <QDateTime>
#include <qwt_date.h>
#include <qwt_date_scale_engine.h>
#include <qwt_date_scale_draw.h>

int main( int argc, char **argv )
{
    QApplication a( argc, argv );

    QwtPlot plot;
    plot.setTitle( "Plot Demo" );
    plot.setCanvasBackground( Qt::white );
    plot.setAxisScale( QwtPlot::yLeft, 0.0, 10.0 );
    plot.insertLegend( new QwtLegend() );
    plot.setAxisScaleDraw( QwtPlot::xBottom, new QwtDateScaleDraw);
    plot.setAxisScaleEngine( QwtPlot::xBottom, new QwtDateScaleEngine);

    QwtPlotGrid *grid = new QwtPlotGrid();
    grid->attach( &plot );

    QwtPlotCurve *curve = new QwtPlotCurve();
    curve->setTitle( "Some Points" );
    curve->setPen( Qt::blue, 4 );
    curve->setRenderHint( QwtPlotItem::RenderAntialiased, true );

    QwtSymbol *symbol = new QwtSymbol( QwtSymbol::Ellipse,
        QBrush( Qt::yellow ), QPen( Qt::red, 2 ), QSize( 8, 8 ) );
    curve->setSymbol( symbol );

    QPolygonF points;
    for (int i=0; i<6; i++) {
      points << QPointF( QwtDate::toDouble(QDateTime(QDate::currentDate().addDays(i))),
                         rand()*10.0/RAND_MAX );
    }
    curve->setSamples( points );

    curve->attach( &plot );

    plot.resize( 800, 600 );
    plot.show();

    return a.exec();
}

Скриншот с графиком


Также смотри пример stockchart.

→ Ссылка