// plot.h
#include <qwt_plot.h>
#include <qwt_plot_spectrogram.h>
class SpectrogramData;
class SpectrogramDataFile;
Q_OBJECT
public:
public Q_SLOTS:
void showSpectrogram( bool on );
void addColumn(const QVector<int> &col);
private:
SpectrogramData *sData;
SpectrogramDataFile *sDataFile;
};
// plot.h
#include <qwt_plot.h>
#include <qwt_plot_spectrogram.h>
class QwtPlotZoomer;
class SpectrogramData;
class SpectrogramDataFile;
class Plot: public QwtPlot {
Q_OBJECT
public:
Plot( QWidget * = NULL );
public Q_SLOTS:
void showSpectrogram( bool on );
void addColumn(const QVector<int> &col);
private:
QwtPlotSpectrogram *d_spectrogram;
SpectrogramData *sData;
SpectrogramDataFile *sDataFile;
QwtPlotZoomer* zoomer;
};
To copy to clipboard, switch view to plain text mode
// plot.cpp
#include <QFile>
#include <QDebug>
#include <qwt_raster_data.h>
#include <qprinter.h>
#include <qprintdialog.h>
#include <qwt_color_map.h>
#include <qwt_plot_spectrogram.h>
#include <qwt_scale_widget.h>
#include <qwt_scale_draw.h>
#include <qwt_plot_zoomer.h>
#include <qwt_plot_panner.h>
#include <qwt_plot_layout.h>
#include <qwt_plot_renderer.h>
#include "plot.h"
#include "SpectrogramData.h"
#include "CONST.h"
const qreal minX = -1.0; // if it will 0.0 we have the same result, just cut axis
//------------------------------------------------------------------------------------------
public:
setTrackerMode( AlwaysOn );
}
bg.setAlpha( 200 );
text.
setBackgroundBrush( QBrush( bg
) );
return text;
}
};
//------------------------------------------------------------------------------------------
private:
int maxX;
int maxY;
vecArray column;
Matrix detectionMatrix;
public:
SpectrogramData() {
maxX = 0;
maxY = 359;
setInterval(Qt::XAxis, QwtInterval(minX, maxX));
setInterval(Qt::YAxis, QwtInterval(minX, maxY));
setInterval(Qt::ZAxis, QwtInterval(minX, 10.0));
}
void setMaxXIncremet() {
++maxX;
setInterval(Qt::XAxis, QwtInterval(minX, maxX));
}
void setMaxX(const int val) {
setInterval(Qt::XAxis, QwtInterval(minX, val));
}
void setMaxY(const int val) {
setInterval(Qt::YAxis, QwtInterval(0.0, val));
}
void addColumn(const QVector<int> &col) {
detectionMatrix.push_back(col);
}
virtual double value(double x, double y) const {
int ix = qRound(x);
int iy = qRound(y);
if ( (ix >= 0) && (ix < maxX) && (iy >= 0) && (iy < maxY) ) {
// qDebug() << x;
return detectionMatrix[ix][iy];
}
return 0;
}
};
//------------------------------------------------------------------------------------------
public:
ColorMap():
addColorStop( 0.6, Qt::cyan );
// addColorStop( 0.6, Qt::green );
addColorStop( 0.9, Qt::yellow );
}
};
//------------------------------------------------------------------------------------------
sData = new SpectrogramData();
sDataFile = new SpectrogramDataFile();
d_spectrogram->setRenderThreadCount( 0 ); // use system specific thread count
d_spectrogram->setColorMap(new ColorMap());
d_spectrogram->setData( sData );
d_spectrogram->attach( this );
const QwtInterval zInterval = d_spectrogram->data()->interval( Qt::ZAxis );
rightAxis->setTitle(tr("Amplitude"));
rightAxis->setColorBarEnabled(true);
rightAxis->setColorMap(zInterval, new ColorMap());
setAxisScale
( QwtPlot::yRight, zInterval.
minValue(), zInterval.
maxValue() );
plotLayout()->setAlignCanvasToScales(true);
replot();
zoomer = new MyZoomer(canvas());
Qt::RightButton, Qt::ControlModifier );
/*Qt::Key_Delete*/Qt::RightButton );
panner
->setAxisEnabled
(QwtPlot::yRight,
false);
panner->setMouseButton(Qt::MidButton);
panner->setMouseTracking(true);
sd->setMinimumExtent( fm.width( "100.00" ) );
zoomer->setRubberBandPen(c);
zoomer->setTrackerPen(c);
}
//------------------------------------------------------------------------------------------
void Plot::addColumn(const QVector<int> &col) {
sData->addColumn(col);
sData->setMaxXIncremet();
const QwtInterval xInterval = d_spectrogram->data()->interval(Qt::XAxis);
const QwtInterval yInterval = d_spectrogram->data()->interval(Qt::YAxis);
zoomer->setZoomBase(rectTmp);
replot();
}
//------------------------------------------------------------------------------------------
void Plot::showSpectrogram( bool on ) {
d_spectrogram
->setDefaultContourPen
( on ?
QPen() : QPen( Qt
::NoPen ) );
replot();
}
// plot.cpp
#include <QFile>
#include <QDebug>
#include <qwt_raster_data.h>
#include <qprinter.h>
#include <qprintdialog.h>
#include <qwt_color_map.h>
#include <qwt_plot_spectrogram.h>
#include <qwt_scale_widget.h>
#include <qwt_scale_draw.h>
#include <qwt_plot_zoomer.h>
#include <qwt_plot_panner.h>
#include <qwt_plot_layout.h>
#include <qwt_plot_renderer.h>
#include "plot.h"
#include "SpectrogramData.h"
#include "CONST.h"
const qreal minX = -1.0; // if it will 0.0 we have the same result, just cut axis
//------------------------------------------------------------------------------------------
class MyZoomer: public QwtPlotZoomer {
public:
MyZoomer( QwtPlotCanvas *canvas ):
QwtPlotZoomer( canvas ) {
setTrackerMode( AlwaysOn );
}
virtual QwtText trackerTextF( const QPointF &pos ) const {
QColor bg( Qt::white );
bg.setAlpha( 200 );
QwtText text = QwtPlotZoomer::trackerTextF( pos );
text.setBackgroundBrush( QBrush( bg ) );
return text;
}
};
//------------------------------------------------------------------------------------------
class SpectrogramData: public QwtRasterData {
private:
int maxX;
int maxY;
vecArray column;
Matrix detectionMatrix;
public:
SpectrogramData() {
maxX = 0;
maxY = 359;
setInterval(Qt::XAxis, QwtInterval(minX, maxX));
setInterval(Qt::YAxis, QwtInterval(minX, maxY));
setInterval(Qt::ZAxis, QwtInterval(minX, 10.0));
}
void setMaxXIncremet() {
++maxX;
setInterval(Qt::XAxis, QwtInterval(minX, maxX));
}
void setMaxX(const int val) {
setInterval(Qt::XAxis, QwtInterval(minX, val));
}
void setMaxY(const int val) {
setInterval(Qt::YAxis, QwtInterval(0.0, val));
}
void addColumn(const QVector<int> &col) {
detectionMatrix.push_back(col);
}
virtual double value(double x, double y) const {
int ix = qRound(x);
int iy = qRound(y);
if ( (ix >= 0) && (ix < maxX) && (iy >= 0) && (iy < maxY) ) {
// qDebug() << x;
return detectionMatrix[ix][iy];
}
return 0;
}
};
//------------------------------------------------------------------------------------------
class ColorMap: public QwtLinearColorMap {
public:
ColorMap():
QwtLinearColorMap( Qt::darkCyan, Qt::red ) {
addColorStop( 0.6, Qt::cyan );
// addColorStop( 0.6, Qt::green );
addColorStop( 0.9, Qt::yellow );
}
};
//------------------------------------------------------------------------------------------
Plot::Plot( QWidget *parent ):
QwtPlot( parent ) {
sData = new SpectrogramData();
sDataFile = new SpectrogramDataFile();
d_spectrogram = new QwtPlotSpectrogram();
d_spectrogram->setRenderThreadCount( 0 ); // use system specific thread count
d_spectrogram->setColorMap(new ColorMap());
d_spectrogram->setData( sData );
d_spectrogram->attach( this );
const QwtInterval zInterval = d_spectrogram->data()->interval( Qt::ZAxis );
QwtScaleWidget *rightAxis = axisWidget(QwtPlot::yRight); // A color bar on the right axis
rightAxis->setTitle(tr("Amplitude"));
rightAxis->setColorBarEnabled(true);
rightAxis->setColorMap(zInterval, new ColorMap());
setAxisScale( QwtPlot::yRight, zInterval.minValue(), zInterval.maxValue() );
enableAxis( QwtPlot::yRight );
plotLayout()->setAlignCanvasToScales(true);
replot();
zoomer = new MyZoomer(canvas());
zoomer->setMousePattern( QwtEventPattern::MouseSelect2,
Qt::RightButton, Qt::ControlModifier );
zoomer->setMousePattern( QwtEventPattern::MouseSelect3,
/*Qt::Key_Delete*/Qt::RightButton );
QwtPlotPanner *panner = new QwtPlotPanner(canvas());
panner->setAxisEnabled(QwtPlot::yRight, false);
panner->setMouseButton(Qt::MidButton);
panner->setMouseTracking(true);
const QFontMetrics fm( axisWidget( QwtPlot::yLeft )->font() );
QwtScaleDraw *sd = axisScaleDraw( QwtPlot::yLeft );
sd->setMinimumExtent( fm.width( "100.00" ) );
const QColor c(Qt::darkBlue);
zoomer->setRubberBandPen(c);
zoomer->setTrackerPen(c);
}
//------------------------------------------------------------------------------------------
void Plot::addColumn(const QVector<int> &col) {
sData->addColumn(col);
sData->setMaxXIncremet();
const QwtInterval xInterval = d_spectrogram->data()->interval(Qt::XAxis);
const QwtInterval yInterval = d_spectrogram->data()->interval(Qt::YAxis);
QRect rectTmp(QPoint(0, 0), QSize(xInterval.maxValue(), yInterval.maxValue()));
zoomer->setZoomBase(rectTmp);
replot();
}
//------------------------------------------------------------------------------------------
void Plot::showSpectrogram( bool on ) {
d_spectrogram->setDisplayMode( QwtPlotSpectrogram::ImageMode, on );
d_spectrogram->setDefaultContourPen( on ? QPen() : QPen( Qt::NoPen ) );
replot();
}
To copy to clipboard, switch view to plain text mode
Bookmarks