#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" 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 { public: SpectrogramData() { setInterval( Qt::XAxis, QwtInterval( -1.5, 1.5 ) ); setInterval( Qt::YAxis, QwtInterval( -1.5, 1.5 ) ); setInterval( Qt::ZAxis, QwtInterval( 0.0, 10.0 ) ); } virtual double value(double x, double y) const { const double c = 0.842; const double v1 = x * x + (y-c) * (y+c); const double v2 = x * (y+c) + x * (y+c); return 1.0 / (v1 * v1 + v2 * v2); } }; class ColorMap: public QwtLinearColorMap { public: ColorMap(): QwtLinearColorMap(Qt::darkCyan, Qt::red) { addColorStop(0.1, Qt::cyan); addColorStop(0.6, Qt::green); addColorStop(0.95, Qt::yellow); } }; Plot::Plot(QWidget *parent): QwtPlot(parent) { d_spectrogram = new QwtPlotSpectrogram(); d_spectrogram->setRenderThreadCount(0); // use system specific thread count d_spectrogram->setColorMap(new ColorMap()); d_spectrogram->setData(new SpectrogramData()); d_spectrogram->attach(this); QList<double> contourLevels; for ( double level = 0.5; level < 10.0; level += 1.0 ) contourLevels += level; d_spectrogram->setContourLevels(contourLevels); const QwtInterval zInterval = d_spectrogram->data()->interval( Qt::ZAxis ); // A color bar on the right axis QwtScaleWidget *rightAxis = axisWidget(QwtPlot::yRight); rightAxis->setTitle("Intensity"); rightAxis->setColorBarEnabled(true); rightAxis->setColorMap( zInterval, new ColorMap()); setAxisScale(QwtPlot::yRight, zInterval.minValue(), zInterval.maxValue() ); enableAxis(QwtPlot::yRight); plotLayout()->setAlignCanvasToScales(true); replot(); // LeftButton for the zooming // MidButton for the panning // RightButton: zoom out by 1 // Ctrl+RighButton: zoom out to full size QwtPlotZoomer* zoomer = new MyZoomer(canvas()); zoomer->setMousePattern(QwtEventPattern::MouseSelect2, Qt::RightButton, Qt::ControlModifier); zoomer->setMousePattern(QwtEventPattern::MouseSelect3, Qt::RightButton); QwtPlotPanner *panner = new QwtPlotPanner(canvas()); panner->setAxisEnabled(QwtPlot::yRight, false); panner->setMouseButton(Qt::MidButton); // Avoid jumping when labels with more/less digits // appear/disappear when scrolling vertically 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::showContour(bool on) { d_spectrogram->setDisplayMode(QwtPlotSpectrogram::ContourMode, on); replot(); } void Plot::showSpectrogram(bool on) { d_spectrogram->setDisplayMode(QwtPlotSpectrogram::ImageMode, on); d_spectrogram->setDefaultContourPen(on ? QPen() : QPen(Qt::NoPen)); replot(); } #ifndef QT_NO_PRINTER void Plot::printPlot() { #if 1 QPrinter printer; #else QPrinter printer(QPrinter::HighResolution); #endif printer.setOrientation(QPrinter::Landscape); printer.setOutputFileName("spectrogram.pdf"); QPrintDialog dialog(&printer); if ( dialog.exec() ) { QwtPlotRenderer renderer; renderer.setDiscardFlag(QwtPlotRenderer::DiscardBackground, false); renderer.setLayoutFlag(QwtPlotRenderer::KeepFrames, true); renderer.renderTo(this, printer); } } #endif