{
Q_OBJECT
public:
~MainWindow();
void createDefaultCurve();
private:
Ui::MainWindowClass *ui;
QVector<double> _xData;
QVector<double> _yData;
};
MainWindow
::MainWindow(QWidget *parent
) : QMainWindow(parent
), ui
(new Ui
::MainWindowClass), _curve
(0) {
ui->setupUi(this);
ui->plot->setCanvasBackground(Qt::white);
// taken from friedberg example
zoomer
->setRubberBandPen
( QColor( Qt
::black ) );
zoomer
->setTrackerPen
( QColor( Qt
::black ) );
Qt::RightButton, Qt::ControlModifier );
Qt::RightButton );
_curve->attach(this->ui->plot);
createDateCurve();
ui->plot->replot();
}
// one hundred dates, from today forward
void MainWindow::createDateCurve()
{
unsigned int time ;
for( int x = 0; x < 100; ++x){
time = QDateTime::currentDateTime().
addDays(x
).
toTime_t();
_xData.append((double)time);
_yData.append((double) (qrand()&0xFF));
}
_curve->setRawSamples(&_xData[0], &_yData[0], _xData.size());
ui
->plot
->setAxisScaleDiv
( QwtPlot::xBottom, dateScaleDiv
() );
ui
->plot
->setAxisScaleDraw
(QwtPlot::xBottom,
new DateScaleDraw
("dd/MM/yyyy"));
ui
->plot
->setAxisScale
(QwtPlot::xBottom, _xData.
first() ,_xData.
last());
}
// major ticks - days
// medium ticks - 12am
// minor ticks - every 2 hours
{
QList<double>
&majorTicks
= ticks
[QwtScaleDiv::MajorTick];
double val;
foreach (val, _xData)
majorTicks += val;
QList<double>
&mediumTicks
= ticks
[QwtScaleDiv::MediumTick];
for (int i = 0; i < _xData.count() - 1; ++i)
mediumTicks
+= QDateTime::fromTime_t(_xData
[i
]).
addSecs(3600 * 12).
toTime_t();
QList<double>
&minorTicks
= ticks
[QwtScaleDiv::MinorTick];
for (int i = 0; i < _xData.count() - 1; ++i)
for (int j = 2; j < 24; j += 2)
minorTicks
+= QDateTime::fromTime_t(_xData
[i
]).
addSecs(120 * j
).
toTime_t();
QwtScaleDiv scaleDiv
( _xData.
first(), _xData.
last(), ticks
);
return scaleDiv;
}
{
public:
DateScaleDraw
(QString fmt
) : format
(fmt
) {
}
virtual QwtText label
(double v
) const {
return t.toString(format);
}
private:
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
void createDefaultCurve();
QwtScaleDiv dateScaleDiv ();
private:
Ui::MainWindowClass *ui;
QwtPlotCurve * _curve;
QVector<double> _xData;
QVector<double> _yData;
};
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindowClass), _curve(0)
{
ui->setupUi(this);
ui->plot->setCanvasBackground(Qt::white);
// taken from friedberg example
QwtPlotZoomer* zoomer = new QwtPlotZoomer( ui->plot->canvas() );
zoomer->setRubberBandPen( QColor( Qt::black ) );
zoomer->setTrackerPen( QColor( Qt::black ) );
zoomer->setMousePattern( QwtEventPattern::MouseSelect2,
Qt::RightButton, Qt::ControlModifier );
zoomer->setMousePattern( QwtEventPattern::MouseSelect3,
Qt::RightButton );
_curve = new QwtPlotCurve();
_curve->attach(this->ui->plot);
createDateCurve();
ui->plot->replot();
}
// one hundred dates, from today forward
void MainWindow::createDateCurve()
{
unsigned int time ;
for( int x = 0; x < 100; ++x){
time = QDateTime::currentDateTime().addDays(x).toTime_t();
_xData.append((double)time);
_yData.append((double) (qrand()&0xFF));
}
_curve->setRawSamples(&_xData[0], &_yData[0], _xData.size());
ui->plot->setAxisScaleDiv( QwtPlot::xBottom, dateScaleDiv() );
ui->plot->setAxisScaleDraw(QwtPlot::xBottom, new DateScaleDraw("dd/MM/yyyy"));
ui->plot->setAxisScale(QwtPlot::xBottom, _xData.first() ,_xData.last());
}
// major ticks - days
// medium ticks - 12am
// minor ticks - every 2 hours
QwtScaleDiv MainWindow::dateScaleDiv ()
{
QList<double> ticks[QwtScaleDiv::NTickTypes];
QList<double> &majorTicks = ticks[QwtScaleDiv::MajorTick];
double val;
foreach (val, _xData)
majorTicks += val;
QList<double> &mediumTicks = ticks[QwtScaleDiv::MediumTick];
for (int i = 0; i < _xData.count() - 1; ++i)
mediumTicks += QDateTime::fromTime_t(_xData[i]).addSecs(3600 * 12).toTime_t();
QList<double> &minorTicks = ticks[QwtScaleDiv::MinorTick];
for (int i = 0; i < _xData.count() - 1; ++i)
for (int j = 2; j < 24; j += 2)
minorTicks += QDateTime::fromTime_t(_xData[i]).addSecs(120 * j).toTime_t();
QwtScaleDiv scaleDiv( _xData.first(), _xData.last(), ticks );
return scaleDiv;
}
class DateScaleDraw: public QwtScaleDraw
{
public:
DateScaleDraw(QString fmt) : format(fmt)
{
setTickLength( QwtScaleDiv::MinorTick, 2 );
setTickLength( QwtScaleDiv::MediumTick, 4 );
setTickLength( QwtScaleDiv::MajorTick, 8 );
}
virtual QwtText label(double v) const
{
QDate t = QDateTime::fromTime_t((int)v).date();
return t.toString(format);
}
private:
const QString format;
};
To copy to clipboard, switch view to plain text mode
Bookmarks