#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "pixmaps.h" #include "plot.h" #include "mainwindow.h" class Zoomer: public QwtPlotZoomer { public: Zoomer( int xAxis, int yAxis, QWidget *canvas ): QwtPlotZoomer( xAxis, yAxis, canvas ) { setTrackerMode( QwtPicker::AlwaysOff ); setRubberBand( QwtPicker::NoRubberBand ); // RightButton: zoom out by 1 // Ctrl+RightButton: zoom out to full size setMousePattern( QwtEventPattern::MouseSelect2, Qt::RightButton, Qt::ControlModifier ); setMousePattern( QwtEventPattern::MouseSelect3, Qt::RightButton ); } }; //----------------------------------------------------------------- // // bode.cpp -- A demo program featuring QwtPlot and QwtCounter // // This example demonstrates the mapping of different curves // to different axes in a QwtPlot widget. It also shows how to // display the cursor position and how to implement zooming. // //----------------------------------------------------------------- MainWindow::MainWindow( QWidget *parent ): QMainWindow( parent ) { d_plot = new Plot( this ); const int margin = 5; d_plot->setContentsMargins( margin, margin, margin, 0 ); setContextMenuPolicy( Qt::NoContextMenu ); d_zoomer[0] = new Zoomer( QwtPlot::xBottom, QwtPlot::yLeft, d_plot->canvas() ); d_zoomer[0]->setRubberBand( QwtPicker::RectRubberBand ); d_zoomer[0]->setRubberBandPen( QColor( Qt::green ) ); d_zoomer[0]->setTrackerMode( QwtPicker::ActiveOnly ); d_zoomer[0]->setTrackerPen( QColor( Qt::white ) ); d_zoomer[1] = new Zoomer( QwtPlot::xTop, QwtPlot::yRight, d_plot->canvas() ); d_panner = new QwtPlotPanner( d_plot->canvas() ); d_panner->setMouseButton( Qt::MidButton ); d_picker = new QwtPlotPicker( QwtPlot::xBottom, QwtPlot::yLeft, QwtPlotPicker::CrossRubberBand, QwtPicker::AlwaysOn, d_plot->canvas() ); d_picker->setStateMachine( new QwtPickerDragPointMachine() ); d_picker->setRubberBandPen( QColor( Qt::green ) ); d_picker->setRubberBand( QwtPicker::CrossRubberBand ); d_picker->setTrackerPen( QColor( Qt::white ) ); setCentralWidget( d_plot ); QToolBar *toolBar = new QToolBar( this ); QToolButton *btnZoom = new QToolButton( toolBar ); btnZoom->setText( "Zoom" ); btnZoom->setIcon( QPixmap( zoom_xpm ) ); btnZoom->setCheckable( true ); btnZoom->setToolButtonStyle( Qt::ToolButtonTextUnderIcon ); toolBar->addWidget( btnZoom ); connect( btnZoom, SIGNAL( toggled( bool ) ), SLOT( enableZoomMode( bool ) ) ); #ifndef QT_NO_PRINTER QToolButton *btnPrint = new QToolButton( toolBar ); btnPrint->setText( "Print" ); btnPrint->setIcon( QPixmap( print_xpm ) ); btnPrint->setToolButtonStyle( Qt::ToolButtonTextUnderIcon ); toolBar->addWidget( btnPrint ); connect( btnPrint, SIGNAL( clicked() ), SLOT( print() ) ); #endif QToolButton *btnExport = new QToolButton( toolBar ); btnExport->setText( "Export" ); btnExport->setIcon( QPixmap( print_xpm ) ); btnExport->setToolButtonStyle( Qt::ToolButtonTextUnderIcon ); toolBar->addWidget( btnExport ); connect( btnExport, SIGNAL( clicked() ), SLOT( exportDocument() ) ); toolBar->addSeparator(); QWidget *hBox = new QWidget( toolBar ); QHBoxLayout *layout = new QHBoxLayout( hBox ); layout->setSpacing( 0 ); layout->addWidget( new QWidget( hBox ), 10 ); // spacer layout->addWidget( new QLabel( "Damping Factor", hBox ), 0 ); layout->addSpacing( 10 ); QwtCounter *cntDamp = new QwtCounter( hBox ); cntDamp->setRange( 0.0, 5.0 ); cntDamp->setSingleStep( 0.01 ); cntDamp->setValue( 0.0 ); layout->addWidget( cntDamp, 0 ); ( void )toolBar->addWidget( hBox ); addToolBar( toolBar ); #ifndef QT_NO_STATUSBAR ( void )statusBar(); #endif enableZoomMode( false ); showInfo(); connect( cntDamp, SIGNAL( valueChanged( double ) ), d_plot, SLOT( setDamp( double ) ) ); connect( d_picker, SIGNAL( moved( const QPoint & ) ), SLOT( moved( const QPoint & ) ) ); connect( d_picker, SIGNAL( selected( const QPolygon & ) ), SLOT( selected( const QPolygon & ) ) ); } #ifndef QT_NO_PRINTER void MainWindow::print() { QPrinter printer( QPrinter::HighResolution ); QString docName = d_plot->title().text(); if ( !docName.isEmpty() ) { docName.replace ( QRegExp ( QString::fromLatin1 ( "\n" ) ), tr ( " -- " ) ); printer.setDocName ( docName ); } printer.setCreator( "Bode example" ); printer.setOrientation( QPrinter::Landscape ); QPrintDialog dialog( &printer ); if ( dialog.exec() ) { QwtPlotRenderer renderer; if ( printer.colorMode() == QPrinter::GrayScale ) { renderer.setDiscardFlag( QwtPlotRenderer::DiscardBackground ); renderer.setDiscardFlag( QwtPlotRenderer::DiscardCanvasBackground ); renderer.setDiscardFlag( QwtPlotRenderer::DiscardCanvasFrame ); renderer.setLayoutFlag( QwtPlotRenderer::FrameWithScales ); } renderer.renderTo( d_plot, printer ); } } #endif void MainWindow::exportDocument() { QwtPlotRenderer renderer; renderer.exportTo( d_plot, "bode.pdf" ); } void MainWindow::enableZoomMode( bool on ) { d_panner->setEnabled( on ); d_zoomer[0]->setEnabled( on ); d_zoomer[0]->zoom( 0 ); d_zoomer[1]->setEnabled( on ); d_zoomer[1]->zoom( 0 ); d_picker->setEnabled( !on ); showInfo(); } void MainWindow::showInfo( QString text ) { if ( text == QString::null ) { if ( d_picker->rubberBand() ) text = "Cursor Pos: Press left mouse button in plot region"; else text = "Zoom: Press mouse button and drag"; } #ifndef QT_NO_STATUSBAR statusBar()->showMessage( text ); #endif } void MainWindow::moved( const QPoint &pos ) { QString info; info.sprintf( "Freq=%g, Ampl=%g, Phase=%g", d_plot->invTransform( QwtPlot::xBottom, pos.x() ), d_plot->invTransform( QwtPlot::yLeft, pos.y() ), d_plot->invTransform( QwtPlot::yRight, pos.y() ) ); showInfo( info ); } void MainWindow::selected( const QPolygon & ) { showInfo(); }