#include <qapplication.h> #include <qlayout.h> #include <qwt_plot.h> #include <qwt_plot_marker.h> #include <qwt_plot_curve.h> #include <qwt_legend.h> #include <qwt_series_data.h> #include <qwt_plot_canvas.h> #include <qwt_plot_panner.h> #include <qwt_plot_magnifier.h> #include <qwt_text.h> #include <qwt_math.h> #include <math.h> //----------------------------------------------------------------- // simple.cpp // // A simple example which shows how to use QwtPlot connected // to a data class without any storage, calculating each values // on the fly. //----------------------------------------------------------------- class FunctionData: public QwtSyntheticPointData { public: FunctionData(double(*y)(double)): QwtSyntheticPointData(100), d_y(y) { } virtual double y(double x) const { return d_y(x); } private: double(*d_y)(double); }; class Plot : public QwtPlot { public: Plot( QWidget *parent = NULL); protected: virtual void resizeEvent( QResizeEvent * ); private: void populate(); void updateGradient(); }; Plot::Plot(QWidget *parent): QwtPlot( parent ) { // panning with the left mouse button (void) new QwtPlotPanner( canvas() ); // zoom in/out with the wheel (void) new QwtPlotMagnifier( canvas() ); setAutoFillBackground( true ); setPalette( QPalette( QColor( 165, 193, 228 ) ) ); updateGradient(); setTitle("A Simple QwtPlot Demonstration"); insertLegend(new QwtLegend(), QwtPlot::RightLegend); // axes setAxisTitle(xBottom, "x -->" ); setAxisScale(xBottom, 0.0, 10.0); setAxisTitle(yLeft, "y -->"); setAxisScale(yLeft, -1.0, 1.0); // canvas canvas()->setLineWidth( 1 ); canvas()->setFrameStyle( QFrame::Box | QFrame::Plain ); canvas()->setBorderRadius( 15 ); QPalette canvasPalette( Qt::white ); canvasPalette.setColor( QPalette::Foreground, QColor( 133, 190, 232 ) ); canvas()->setPalette( canvasPalette ); populate(); } void Plot::populate() { // Insert new curves QwtPlotCurve *cSin = new QwtPlotCurve("y = sin(x)"); cSin->setRenderHint(QwtPlotItem::RenderAntialiased); cSin->setLegendAttribute(QwtPlotCurve::LegendShowLine, true); cSin->setPen(QPen(Qt::red)); cSin->attach(this); QwtPlotCurve *cCos = new QwtPlotCurve("y = cos(x)"); cCos->setRenderHint(QwtPlotItem::RenderAntialiased); cCos->setLegendAttribute(QwtPlotCurve::LegendShowLine, true); cCos->setPen(QPen(Qt::blue)); cCos->attach(this); // Create sin and cos data cSin->setData(new FunctionData(::sin)); cCos->setData(new FunctionData(::cos)); // Insert markers // ...a horizontal line at y = 0... QwtPlotMarker *mY = new QwtPlotMarker(); mY->setLabel(QString::fromLatin1("y = 0")); mY->setLabelAlignment(Qt::AlignRight|Qt::AlignTop); mY->setLineStyle(QwtPlotMarker::HLine); mY->setYValue(0.0); mY->attach(this); // ...a vertical line at x = 2 * pi QwtPlotMarker *mX = new QwtPlotMarker(); mX->setLabel(QString::fromLatin1("x = 2 pi")); mX->setLabelAlignment(Qt::AlignLeft | Qt::AlignBottom); mX->setLabelOrientation(Qt::Vertical); mX->setLineStyle(QwtPlotMarker::VLine); mX->setLinePen(QPen(Qt::black, 0, Qt::DashDotLine)); mX->setXValue(2.0 * M_PI); mX->attach(this); } void Plot::updateGradient() { QPalette pal = palette(); const QColor buttonColor = pal.color( QPalette::Button ); #ifdef Q_WS_X11 // Qt 4.7.1: QGradient::StretchToDeviceMode is buggy on X11 QLinearGradient gradient( rect().topLeft(), rect().bottomLeft() ); gradient.setColorAt( 0.0, Qt::white ); gradient.setColorAt( 0.7, buttonColor ); gradient.setColorAt( 1.0, buttonColor ); #else QLinearGradient gradient( 0, 0, 0, 1 ); gradient.setCoordinateMode( QGradient::StretchToDeviceMode ); gradient.setColorAt( 0.0, Qt::white ); gradient.setColorAt( 0.7, buttonColor ); gradient.setColorAt( 1.0, buttonColor ); #endif pal.setBrush( QPalette::Window, gradient ); setPalette( pal ); } void Plot::resizeEvent( QResizeEvent *event ) { QwtPlot::resizeEvent( event ); #ifdef Q_WS_X11 updateGradient(); #endif } int main(int argc, char **argv) { QApplication a(argc, argv); Plot *plot = new Plot(); // We put a dummy widget around to have // so that Qt paints a widget background // when resizing QWidget window; QHBoxLayout *layout = new QHBoxLayout( &window ); layout->setContentsMargins( 0, 0, 0, 0 ); layout->addWidget( plot ); window.resize(600,400); window.show(); return a.exec(); }