qt_demoe/qwtdemo/examples/legends/plot.cpp

264 lines
6.2 KiB
C++
Raw Normal View History

2019-11-07 02:55:57 +00:00
#include "plot.h"
#include "settings.h"
#include <qwt_plot_curve.h>
#include <qwt_plot_legenditem.h>
#include <qwt_legend.h>
#include <qwt_plot_canvas.h>
#include <qwt_plot_grid.h>
#include <qwt_plot_layout.h>
class LegendItem: public QwtPlotLegendItem
{
public:
LegendItem()
{
setRenderHint( QwtPlotItem::RenderAntialiased );
QColor color( Qt::white );
setTextPen( color );
#if 1
setBorderPen( color );
QColor c( Qt::gray );
c.setAlpha( 200 );
setBackgroundBrush( c );
#endif
}
};
class Curve: public QwtPlotCurve
{
public:
Curve( int index ):
d_index( index )
{
setRenderHint( QwtPlotItem::RenderAntialiased );
initData();
}
void setCurveTitle( const QString &title )
{
QString txt("%1 %2");
setTitle( QString( "%1 %2" ).arg( title ).arg( d_index ) );
}
void initData()
{
QVector<QPointF> points;
double y = qrand() % 1000;
for ( double x = 0.0; x <= 1000.0; x += 100.0 )
{
double off = qrand() % 200 - 100;
if ( y + off > 980.0 || y + off < 20.0 )
off = -off;
y += off;
points += QPointF( x, y );
}
setSamples( points );
}
private:
const int d_index;
};
Plot::Plot( QWidget *parent ):
QwtPlot( parent ),
d_externalLegend( NULL ),
d_legendItem( NULL ),
d_isDirty( false )
{
QwtPlotCanvas *canvas = new QwtPlotCanvas();
canvas->setFocusIndicator( QwtPlotCanvas::CanvasFocusIndicator );
canvas->setFocusPolicy( Qt::StrongFocus );
canvas->setPalette( Qt::black );
setCanvas( canvas );
setAutoReplot( false );
setTitle( "Legend Test" );
setFooter( "Footer" );
// grid
QwtPlotGrid *grid = new QwtPlotGrid;
grid->enableXMin( true );
grid->setMajorPen( Qt::gray, 0, Qt::DotLine );
grid->setMinorPen( Qt::darkGray, 0, Qt::DotLine );
grid->attach( this );
// axis
setAxisScale( QwtPlot::yLeft, 0.0, 1000.0 );
setAxisScale( QwtPlot::xBottom, 0.0, 1000.0 );
}
Plot::~Plot()
{
delete d_externalLegend;
}
void Plot::insertCurve()
{
static int counter = 1;
const char *colors[] =
{
"LightSalmon",
"SteelBlue",
"Yellow",
"Fuchsia",
"PaleGreen",
"PaleTurquoise",
"Cornsilk",
"HotPink",
"Peru",
"Maroon"
};
const int numColors = sizeof( colors ) / sizeof( colors[0] );
QwtPlotCurve *curve = new Curve( counter++ );
curve->setPen( QColor( colors[ counter % numColors ] ), 2 );
curve->attach( this );
}
void Plot::applySettings( const Settings &settings )
{
d_isDirty = false;
setAutoReplot( true );
if ( settings.legend.isEnabled )
{
if ( settings.legend.position > QwtPlot::TopLegend )
{
if ( legend() )
{
// remove legend controlled by the plot
insertLegend( NULL );
}
if ( d_externalLegend == NULL )
{
d_externalLegend = new QwtLegend();
d_externalLegend->setWindowTitle("Plot Legend");
connect(
this,
SIGNAL( legendDataChanged( const QVariant &,
const QList<QwtLegendData> & ) ),
d_externalLegend,
SLOT( updateLegend( const QVariant &,
const QList<QwtLegendData> & ) ) );
d_externalLegend->show();
// populate the new legend
updateLegend();
}
}
else
{
delete d_externalLegend;
d_externalLegend = NULL;
if ( legend() == NULL ||
plotLayout()->legendPosition() != settings.legend.position )
{
insertLegend( new QwtLegend(),
QwtPlot::LegendPosition( settings.legend.position ) );
}
}
}
else
{
insertLegend( NULL );
delete d_externalLegend;
d_externalLegend = NULL;
}
if ( settings.legendItem.isEnabled )
{
if ( d_legendItem == NULL )
{
d_legendItem = new LegendItem();
d_legendItem->attach( this );
}
d_legendItem->setMaxColumns( settings.legendItem.numColumns );
d_legendItem->setAlignment( Qt::Alignment( settings.legendItem.alignment ) );
d_legendItem->setBackgroundMode(
QwtPlotLegendItem::BackgroundMode( settings.legendItem.backgroundMode ) );
if ( settings.legendItem.backgroundMode ==
QwtPlotLegendItem::ItemBackground )
{
d_legendItem->setBorderRadius( 4 );
d_legendItem->setMargin( 0 );
d_legendItem->setSpacing( 4 );
d_legendItem->setItemMargin( 2 );
}
else
{
d_legendItem->setBorderRadius( 8 );
d_legendItem->setMargin( 4 );
d_legendItem->setSpacing( 2 );
d_legendItem->setItemMargin( 0 );
}
QFont font = d_legendItem->font();
font.setPointSize( settings.legendItem.size );
d_legendItem->setFont( font );
}
else
{
delete d_legendItem;
d_legendItem = NULL;
}
QwtPlotItemList curveList = itemList( QwtPlotItem::Rtti_PlotCurve );
if ( curveList.size() != settings.curve.numCurves )
{
while ( curveList.size() > settings.curve.numCurves )
{
QwtPlotItem* curve = curveList.takeFirst();
delete curve;
}
for ( int i = curveList.size(); i < settings.curve.numCurves; i++ )
insertCurve();
}
curveList = itemList( QwtPlotItem::Rtti_PlotCurve );
for ( int i = 0; i < curveList.count(); i++ )
{
Curve* curve = static_cast<Curve*>( curveList[i] );
curve->setCurveTitle( settings.curve.title );
int sz = 0.5 * settings.legendItem.size;
curve->setLegendIconSize( QSize( sz, sz ) );
}
setAutoReplot( false );
if ( d_isDirty )
{
d_isDirty = false;
replot();
}
}
void Plot::replot()
{
if ( autoReplot() )
{
d_isDirty = true;
return;
}
QwtPlot::replot();
}