Following is the example of simple date-value curve constructed using 100 days on x axis and random y-values.

My question is about the zoomer behavior. When I do "zoom-in" the curve displays correctly and ticks/labels also looks correct. When I do "zoom-out" back to the original view, the curve dissapears and labels are also wrong.

I'll appreciate the review of the code below. What am I doing wrong here?


Qt Code:
  1. class MainWindow : public QMainWindow
  2. {
  3. Q_OBJECT
  4.  
  5. public:
  6. MainWindow(QWidget *parent = 0);
  7. ~MainWindow();
  8.  
  9. void createDefaultCurve();
  10. QwtScaleDiv dateScaleDiv ();
  11.  
  12. private:
  13. Ui::MainWindowClass *ui;
  14.  
  15. QwtPlotCurve * _curve;
  16. QVector<double> _xData;
  17. QVector<double> _yData;
  18. };
  19.  
  20.  
  21. MainWindow::MainWindow(QWidget *parent)
  22. : QMainWindow(parent), ui(new Ui::MainWindowClass), _curve(0)
  23. {
  24. ui->setupUi(this);
  25.  
  26. ui->plot->setCanvasBackground(Qt::white);
  27.  
  28. // taken from friedberg example
  29. QwtPlotZoomer* zoomer = new QwtPlotZoomer( ui->plot->canvas() );
  30. zoomer->setRubberBandPen( QColor( Qt::black ) );
  31. zoomer->setTrackerPen( QColor( Qt::black ) );
  32. zoomer->setMousePattern( QwtEventPattern::MouseSelect2,
  33. Qt::RightButton, Qt::ControlModifier );
  34. zoomer->setMousePattern( QwtEventPattern::MouseSelect3,
  35. Qt::RightButton );
  36.  
  37. _curve = new QwtPlotCurve();
  38. _curve->attach(this->ui->plot);
  39.  
  40. createDateCurve();
  41.  
  42. ui->plot->replot();
  43. }
  44.  
  45. // one hundred dates, from today forward
  46. void MainWindow::createDateCurve()
  47. {
  48. unsigned int time ;
  49. for( int x = 0; x < 100; ++x){
  50. time = QDateTime::currentDateTime().addDays(x).toTime_t();
  51. _xData.append((double)time);
  52. _yData.append((double) (qrand()&0xFF));
  53. }
  54.  
  55. _curve->setRawSamples(&_xData[0], &_yData[0], _xData.size());
  56.  
  57. ui->plot->setAxisScaleDiv( QwtPlot::xBottom, dateScaleDiv() );
  58. ui->plot->setAxisScaleDraw(QwtPlot::xBottom, new DateScaleDraw("dd/MM/yyyy"));
  59.  
  60. ui->plot->setAxisScale(QwtPlot::xBottom, _xData.first() ,_xData.last());
  61. }
  62.  
  63.  
  64. // major ticks - days
  65. // medium ticks - 12am
  66. // minor ticks - every 2 hours
  67. QwtScaleDiv MainWindow::dateScaleDiv ()
  68. {
  69. QList<double> ticks[QwtScaleDiv::NTickTypes];
  70.  
  71. QList<double> &majorTicks = ticks[QwtScaleDiv::MajorTick];
  72. double val;
  73. foreach (val, _xData)
  74. majorTicks += val;
  75.  
  76. QList<double> &mediumTicks = ticks[QwtScaleDiv::MediumTick];
  77. for (int i = 0; i < _xData.count() - 1; ++i)
  78. mediumTicks += QDateTime::fromTime_t(_xData[i]).addSecs(3600 * 12).toTime_t();
  79.  
  80. QList<double> &minorTicks = ticks[QwtScaleDiv::MinorTick];
  81. for (int i = 0; i < _xData.count() - 1; ++i)
  82. for (int j = 2; j < 24; j += 2)
  83. minorTicks += QDateTime::fromTime_t(_xData[i]).addSecs(120 * j).toTime_t();
  84.  
  85. QwtScaleDiv scaleDiv( _xData.first(), _xData.last(), ticks );
  86. return scaleDiv;
  87. }
  88.  
  89.  
  90. class DateScaleDraw: public QwtScaleDraw
  91. {
  92. public:
  93. DateScaleDraw(QString fmt) : format(fmt)
  94. {
  95. setTickLength( QwtScaleDiv::MinorTick, 2 );
  96. setTickLength( QwtScaleDiv::MediumTick, 4 );
  97. setTickLength( QwtScaleDiv::MajorTick, 8 );
  98. }
  99.  
  100. virtual QwtText label(double v) const
  101. {
  102. QDate t = QDateTime::fromTime_t((int)v).date();
  103. return t.toString(format);
  104. }
  105. private:
  106. const QString format;
  107. };
To copy to clipboard, switch view to plain text mode