142 lines
3.2 KiB
C++
142 lines
3.2 KiB
C++
|
#include <qglobal.h>
|
||
|
#include <qtimer.h>
|
||
|
#include <qwt_plot_grid.h>
|
||
|
#include <qwt_plot_canvas.h>
|
||
|
#include <qwt_plot_layout.h>
|
||
|
#include <qwt_scale_widget.h>
|
||
|
#include <qwt_scale_draw.h>
|
||
|
#include "scrollzoomer.h"
|
||
|
#include "randomplot.h"
|
||
|
|
||
|
const unsigned int c_rangeMax = 1000;
|
||
|
|
||
|
class Zoomer: public ScrollZoomer
|
||
|
{
|
||
|
public:
|
||
|
Zoomer( QWidget *canvas ):
|
||
|
ScrollZoomer( canvas )
|
||
|
{
|
||
|
#if 0
|
||
|
setRubberBandPen( QPen( Qt::red, 2, Qt::DotLine ) );
|
||
|
#else
|
||
|
setRubberBandPen( QPen( Qt::red ) );
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
virtual QwtText trackerTextF( const QPointF &pos ) const
|
||
|
{
|
||
|
QColor bg( Qt::white );
|
||
|
|
||
|
QwtText text = QwtPlotZoomer::trackerTextF( pos );
|
||
|
text.setBackgroundBrush( QBrush( bg ) );
|
||
|
return text;
|
||
|
}
|
||
|
|
||
|
virtual void rescale()
|
||
|
{
|
||
|
QwtScaleWidget *scaleWidget = plot()->axisWidget( yAxis() );
|
||
|
QwtScaleDraw *sd = scaleWidget->scaleDraw();
|
||
|
|
||
|
double minExtent = 0.0;
|
||
|
if ( zoomRectIndex() > 0 )
|
||
|
{
|
||
|
// When scrolling in vertical direction
|
||
|
// the plot is jumping in horizontal direction
|
||
|
// because of the different widths of the labels
|
||
|
// So we better use a fixed extent.
|
||
|
|
||
|
minExtent = sd->spacing() + sd->maxTickLength() + 1;
|
||
|
minExtent += sd->labelSize(
|
||
|
scaleWidget->font(), c_rangeMax ).width();
|
||
|
}
|
||
|
|
||
|
sd->setMinimumExtent( minExtent );
|
||
|
|
||
|
ScrollZoomer::rescale();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
RandomPlot::RandomPlot( QWidget *parent ):
|
||
|
IncrementalPlot( parent ),
|
||
|
d_timer( 0 ),
|
||
|
d_timerCount( 0 )
|
||
|
{
|
||
|
setFrameStyle( QFrame::NoFrame );
|
||
|
setLineWidth( 0 );
|
||
|
|
||
|
plotLayout()->setAlignCanvasToScales( true );
|
||
|
|
||
|
QwtPlotGrid *grid = new QwtPlotGrid;
|
||
|
grid->setMajorPen( Qt::gray, 0, Qt::DotLine );
|
||
|
grid->attach( this );
|
||
|
|
||
|
setCanvasBackground( QColor( 29, 100, 141 ) ); // nice blue
|
||
|
|
||
|
setAxisScale( xBottom, 0, c_rangeMax );
|
||
|
setAxisScale( yLeft, 0, c_rangeMax );
|
||
|
|
||
|
replot();
|
||
|
|
||
|
// enable zooming
|
||
|
|
||
|
( void ) new Zoomer( canvas() );
|
||
|
}
|
||
|
|
||
|
QSize RandomPlot::sizeHint() const
|
||
|
{
|
||
|
return QSize( 540, 400 );
|
||
|
}
|
||
|
|
||
|
void RandomPlot::appendPoint()
|
||
|
{
|
||
|
double x = qrand() % c_rangeMax;
|
||
|
x += ( qrand() % 100 ) / 100;
|
||
|
|
||
|
double y = qrand() % c_rangeMax;
|
||
|
y += ( qrand() % 100 ) / 100;
|
||
|
|
||
|
IncrementalPlot::appendPoint( QPointF( x, y ) );
|
||
|
|
||
|
if ( --d_timerCount <= 0 )
|
||
|
stop();
|
||
|
}
|
||
|
|
||
|
void RandomPlot::append( int timeout, int count )
|
||
|
{
|
||
|
if ( !d_timer )
|
||
|
{
|
||
|
d_timer = new QTimer( this );
|
||
|
connect( d_timer, SIGNAL( timeout() ), SLOT( appendPoint() ) );
|
||
|
}
|
||
|
|
||
|
d_timerCount = count;
|
||
|
|
||
|
Q_EMIT running( true );
|
||
|
d_timeStamp.start();
|
||
|
|
||
|
QwtPlotCanvas *plotCanvas = qobject_cast<QwtPlotCanvas *>( canvas() );
|
||
|
plotCanvas->setPaintAttribute( QwtPlotCanvas::BackingStore, false );
|
||
|
|
||
|
d_timer->start( timeout );
|
||
|
}
|
||
|
|
||
|
void RandomPlot::stop()
|
||
|
{
|
||
|
Q_EMIT elapsed( d_timeStamp.elapsed() );
|
||
|
|
||
|
if ( d_timer )
|
||
|
{
|
||
|
d_timer->stop();
|
||
|
Q_EMIT running( false );
|
||
|
}
|
||
|
|
||
|
QwtPlotCanvas *plotCanvas = qobject_cast<QwtPlotCanvas *>( canvas() );
|
||
|
plotCanvas->setPaintAttribute( QwtPlotCanvas::BackingStore, true );
|
||
|
}
|
||
|
|
||
|
void RandomPlot::clear()
|
||
|
{
|
||
|
clearPoints();
|
||
|
replot();
|
||
|
}
|