#include #include #include #include #include #include #include #include #include #include "randomplot.h" #include "mainwindow.h" #include "start.xpm" #include "clear.xpm" class MyToolBar: public QToolBar { public: MyToolBar( MainWindow *parent ): QToolBar( parent ) { } void addSpacing( int spacing ) { QLabel *label = new QLabel( this ); addWidget( label ); label->setFixedWidth( spacing ); } }; class Counter: public QWidget { public: Counter( QWidget *parent, const QString &prefix, const QString &suffix, int min, int max, int step ): QWidget( parent ) { QHBoxLayout *layout = new QHBoxLayout( this ); if ( !prefix.isEmpty() ) layout->addWidget( new QLabel( prefix + " ", this ) ); d_counter = new QSpinBox( this ); d_counter->setRange( min, max ); d_counter->setSingleStep( step ); layout->addWidget( d_counter ); if ( !suffix.isEmpty() ) layout->addWidget( new QLabel( QString( " " ) + suffix, this ) ); } void setValue( int value ) { d_counter->setValue( value ); } int value() const { return d_counter->value(); } private: QSpinBox *d_counter; }; MainWindow::MainWindow() { addToolBar( toolBar() ); #ifndef QT_NO_STATUSBAR ( void )statusBar(); #endif d_plot = new RandomPlot( this ); const int margin = 4; d_plot->setContentsMargins( margin, margin, margin, margin ); setCentralWidget( d_plot ); connect( d_startAction, SIGNAL( toggled( bool ) ), this, SLOT( appendPoints( bool ) ) ); connect( d_clearAction, SIGNAL( triggered() ), d_plot, SLOT( clear() ) ); connect( d_symbolType, SIGNAL( toggled( bool ) ), d_plot, SLOT( showSymbols( bool ) ) ); connect( d_plot, SIGNAL( running( bool ) ), this, SLOT( showRunning( bool ) ) ); connect( d_plot, SIGNAL( elapsed( int ) ), this, SLOT( showElapsed( int ) ) ); initWhatsThis(); setContextMenuPolicy( Qt::NoContextMenu ); } QToolBar *MainWindow::toolBar() { MyToolBar *toolBar = new MyToolBar( this ); toolBar->setAllowedAreas( Qt::TopToolBarArea | Qt::BottomToolBarArea ); setToolButtonStyle( Qt::ToolButtonTextUnderIcon ); d_startAction = new QAction( QPixmap( start_xpm ), "Start", toolBar ); d_startAction->setCheckable( true ); d_clearAction = new QAction( QPixmap( clear_xpm ), "Clear", toolBar ); QAction *whatsThisAction = QWhatsThis::createAction( toolBar ); whatsThisAction->setText( "Help" ); toolBar->addAction( d_startAction ); toolBar->addAction( d_clearAction ); toolBar->addAction( whatsThisAction ); setIconSize( QSize( 22, 22 ) ); QWidget *hBox = new QWidget( toolBar ); d_symbolType = new QCheckBox( "Symbols", hBox ); d_symbolType->setChecked( true ); d_randomCount = new Counter( hBox, "Points", QString::null, 1, 100000, 100 ); d_randomCount->setValue( 1000 ); d_timerCount = new Counter( hBox, "Delay", "ms", 0, 100000, 100 ); d_timerCount->setValue( 0 ); QHBoxLayout *layout = new QHBoxLayout( hBox ); layout->setMargin( 0 ); layout->setSpacing( 0 ); layout->addSpacing( 10 ); layout->addWidget( new QWidget( hBox ), 10 ); // spacer layout->addWidget( d_symbolType ); layout->addSpacing( 5 ); layout->addWidget( d_randomCount ); layout->addSpacing( 5 ); layout->addWidget( d_timerCount ); showRunning( false ); toolBar->addWidget( hBox ); return toolBar; } void MainWindow::appendPoints( bool on ) { if ( on ) d_plot->append( d_timerCount->value(), d_randomCount->value() ); else d_plot->stop(); } void MainWindow::showRunning( bool running ) { d_randomCount->setEnabled( !running ); d_timerCount->setEnabled( !running ); d_startAction->setChecked( running ); d_startAction->setText( running ? "Stop" : "Start" ); } void MainWindow::showElapsed( int ms ) { QString text; text.setNum( ms ); text += " ms"; statusBar()->showMessage( text ); } void MainWindow::initWhatsThis() { const char *text1 = "Zooming is enabled until the selected area gets " "too small for the significance on the axes.\n\n" "You can zoom in using the left mouse button.\n" "The middle mouse button is used to go back to the " "previous zoomed area.\n" "The right mouse button is used to unzoom completely."; const char *text2 = "Number of random points that will be generated."; const char *text3 = "Delay between the generation of two random points."; const char *text4 = "Start generation of random points.\n\n" "The intention of this example is to show how to implement " "growing curves. The points will be generated and displayed " "one after the other.\n" "To check the performance, a small delay and a large number " "of points are useful. To watch the curve growing, a delay " " > 300 ms and less points are better.\n" "To inspect the curve, stacked zooming is implemented using the " "mouse buttons on the plot."; const char *text5 = "Remove all points."; d_plot->setWhatsThis( text1 ); d_randomCount->setWhatsThis( text2 ); d_timerCount->setWhatsThis( text3 ); d_startAction->setWhatsThis( text4 ); d_clearAction->setWhatsThis( text5 ); }