You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
4.6 KiB
166 lines
4.6 KiB
14 years ago
|
/****************************************************************************
|
||
|
**
|
||
|
** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
|
||
|
**
|
||
|
** This file is part of an example program for Qt. This example
|
||
|
** program may be used, distributed and modified without limitation.
|
||
|
**
|
||
|
*****************************************************************************/
|
||
|
|
||
|
#include "progressbar.h"
|
||
|
|
||
|
#include <qradiobutton.h>
|
||
|
#include <qpushbutton.h>
|
||
|
#include <qprogressbar.h>
|
||
|
#include <qlayout.h>
|
||
|
|
||
|
#include <qmotifstyle.h>
|
||
|
|
||
|
/*
|
||
|
* Constructor
|
||
|
*
|
||
|
* Creates child widgets of the ProgressBar widget
|
||
|
*/
|
||
|
|
||
|
ProgressBar::ProgressBar( QWidget *parent, const char *name )
|
||
|
: QButtonGroup( 0, Horizontal, "Progress Bar", parent, name ), timer()
|
||
|
{
|
||
|
setMargin( 10 );
|
||
|
|
||
|
QGridLayout* toplayout = new QGridLayout( layout(), 2, 2, 5);
|
||
|
|
||
|
setRadioButtonExclusive( TRUE );
|
||
|
|
||
|
// insert three radiobuttons which the user can use
|
||
|
// to set the speed of the progress and two pushbuttons
|
||
|
// to start/pause/continue and reset the progress
|
||
|
slow = new QRadioButton( "S&low", this );
|
||
|
normal = new QRadioButton( "&Normal", this );
|
||
|
fast = new QRadioButton( "&Fast", this );
|
||
|
QVBoxLayout* vb1 = new QVBoxLayout;
|
||
|
toplayout->addLayout( vb1, 0, 0 );
|
||
|
vb1->addWidget( slow );
|
||
|
vb1->addWidget( normal );
|
||
|
vb1->addWidget( fast );
|
||
|
|
||
|
// two push buttons, one for start, for for reset.
|
||
|
start = new QPushButton( "&Start", this );
|
||
|
reset = new QPushButton( "&Reset", this );
|
||
|
QVBoxLayout* vb2 = new QVBoxLayout;
|
||
|
toplayout->addLayout( vb2, 0, 1 );
|
||
|
vb2->addWidget( start );
|
||
|
vb2->addWidget( reset );
|
||
|
|
||
|
// Create the progressbar
|
||
|
progress = new QProgressBar( 100, this );
|
||
|
// progress->setStyle( new QMotifStyle() );
|
||
|
toplayout->addMultiCellWidget( progress, 1, 1, 0, 1 );
|
||
|
|
||
|
// connect the clicked() SIGNALs of the pushbuttons to SLOTs
|
||
|
connect( start, SIGNAL( clicked() ), this, SLOT( slotStart() ) );
|
||
|
connect( reset, SIGNAL( clicked() ), this, SLOT( slotReset() ) );
|
||
|
|
||
|
// connect the timeout() SIGNAL of the progress-timer to a SLOT
|
||
|
connect( &timer, SIGNAL( timeout() ), this, SLOT( slotTimeout() ) );
|
||
|
|
||
|
// Let's start with normal speed...
|
||
|
normal->setChecked( TRUE );
|
||
|
|
||
|
|
||
|
// some contraints
|
||
|
start->setFixedWidth( 80 );
|
||
|
setMinimumWidth( 300 );
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* SLOT slotStart
|
||
|
*
|
||
|
* This SLOT is called if the user clicks start/pause/continue
|
||
|
* button
|
||
|
*/
|
||
|
|
||
|
void ProgressBar::slotStart()
|
||
|
{
|
||
|
// If the progress bar is at the beginning...
|
||
|
if ( progress->progress() == -1 ) {
|
||
|
// ...set according to the checked speed-radiobutton
|
||
|
// the number of steps which are needed to complete the process
|
||
|
if ( slow->isChecked() )
|
||
|
progress->setTotalSteps( 10000 );
|
||
|
else if ( normal->isChecked() )
|
||
|
progress->setTotalSteps( 1000 );
|
||
|
else
|
||
|
progress->setTotalSteps( 50 );
|
||
|
|
||
|
// disable the speed-radiobuttons
|
||
|
slow->setEnabled( FALSE );
|
||
|
normal->setEnabled( FALSE );
|
||
|
fast->setEnabled( FALSE );
|
||
|
}
|
||
|
|
||
|
// If the progress is not running...
|
||
|
if ( !timer.isActive() ) {
|
||
|
// ...start the timer (and so the progress) with a interval of 1 ms...
|
||
|
timer.start( 1 );
|
||
|
// ...and rename the start/pause/continue button to Pause
|
||
|
start->setText( "&Pause" );
|
||
|
} else { // if the prgress is running...
|
||
|
// ...stop the timer (and so the prgress)...
|
||
|
timer.stop();
|
||
|
// ...and rename the start/pause/continue button to Continue
|
||
|
start->setText( "&Continue" );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* SLOT slotReset
|
||
|
*
|
||
|
* This SLOT is called when the user clicks the reset button
|
||
|
*/
|
||
|
|
||
|
void ProgressBar::slotReset()
|
||
|
{
|
||
|
// stop the timer and progress
|
||
|
timer.stop();
|
||
|
|
||
|
// rename the start/pause/continue button to Start...
|
||
|
start->setText( "&Start" );
|
||
|
// ...and enable this button
|
||
|
start->setEnabled( TRUE );
|
||
|
|
||
|
// enable the speed-radiobuttons
|
||
|
slow->setEnabled( TRUE );
|
||
|
normal->setEnabled( TRUE );
|
||
|
fast->setEnabled( TRUE );
|
||
|
|
||
|
// reset the progressbar
|
||
|
progress->reset();
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* SLOT slotTimeout
|
||
|
*
|
||
|
* This SLOT is called each ms when the timer is
|
||
|
* active (== progress is running)
|
||
|
*/
|
||
|
|
||
|
void ProgressBar::slotTimeout()
|
||
|
{
|
||
|
int p = progress->progress();
|
||
|
|
||
|
#if 1
|
||
|
// If the progress is complete...
|
||
|
if ( p == progress->totalSteps() ) {
|
||
|
// ...rename the start/pause/continue button to Start...
|
||
|
start->setText( "&Start" );
|
||
|
// ...and disable it...
|
||
|
start->setEnabled( FALSE );
|
||
|
// ...and return
|
||
|
return;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
// If the process is not complete increase it
|
||
|
progress->setProgress( ++p );
|
||
|
}
|