Validators
In this example you see how to write and use an own validator.
Header file of the validator: /****************************************************************************
** $Id: qt/examples/validator/motor.h 2.2.1 edited 2000-08-31 $
**
** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
**
** This file is part of an example program for Qt. This example
** program may be used, distributed and modified without limitation.
**
*****************************************************************************/
#ifndef MOTOR_H
#define MOTOR_H
#include <qvalidator.h>
#include <qspinbox.h>
class MotorValidator: public QValidator
{
Q_OBJECT
public:
MotorValidator( QSpinBox * parent, const char * name );
~MotorValidator();
void setRange( int bottom, int top, int step );
int bottom() { return b; }
int top() { return t; }
int step() { return s; }
QValidator::State validate( QString &, int & ) const;
private:
int b, t, s;
};
#endif
Implementation of the validator: /****************************************************************************
** $Id: qt/examples/validator/motor.cpp 2.2.1 edited 2000-08-31 $
**
** Copyright (C) 1992-2000 Trolltech AS. 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 "motor.h"
#include "qlineedit.h"
#include "qpushbutton.h"
MotorValidator::MotorValidator( QSpinBox * parent, const char * name )
: QValidator( parent, name )
{
// just some random junk.
b = 0;
t = 42;
s = 2;
}
MotorValidator::~MotorValidator()
{
// nothing. wow. programming qt is easy.
}
void MotorValidator::setRange( int bottom, int top, int step )
{
b = bottom;
t = top;
s = step;
}
// the guts of this example: return TRUE if motorSize describes an
// integer in the range b to t which can be described as n*s+b for
// some integer n.
QValidator::State MotorValidator::validate( QString & motorSize, int & ) const
{
bool ok;
long int tmp = motorSize.toLong( &ok );
if ( !ok )
return QValidator::Invalid;
else if ( tmp < b || tmp > t || ((tmp-b)%s) != 0 )
return QValidator::Valid;
else
return QValidator::Acceptable;
}
Header file of the mainwidget: /****************************************************************************
** $Id: qt/examples/validator/vw.h 2.2.1 edited 2000-08-31 $
**
** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
**
** This file is part of an example program for Qt. This example
** program may be used, distributed and modified without limitation.
**
*****************************************************************************/
#ifndef VW_H
#define VW_H
#include <qvalidator.h>
#include <qstring.h>
#include <qwidget.h>
class VW: public QWidget {
Q_OBJECT
public:
VW( QWidget * parent = 0, const char * name = 0 );
~VW();
private slots:
void modelSelected( const QString& );
void motorSelected( int );
void yearSelected( int );
signals:
void validSelectionMade( const QString& );
private:
void computeSelection();
QString currentModel;
int currentMotorSize;
int currentYear;
};
#endif
Implementation of the mainwidget: /****************************************************************************
** $Id: qt/examples/validator/vw.cpp 2.2.1 edited 2000-08-31 $
**
** Copyright (C) 1992-2000 Trolltech AS. 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 "vw.h"
#include <qlineedit.h>
#include <qcombobox.h>
#include <qspinbox.h>
#include <qlayout.h>
#include <qgroupbox.h>
#include <qlabel.h>
#include "motor.h"
VW::VW( QWidget * parent, const char * name )
: QWidget( parent, name )
{
QHBoxLayout * hb;
hb = new QHBoxLayout( this, 10 );
QGroupBox * box;
box = new QGroupBox( this, "input box" );
hb->addWidget( box, 0, AlignTop );
QVBoxLayout * b;
// set up the input box
b = new QVBoxLayout( box, 12 );
QLabel * l = new QLabel( "Enter Vehicle Details", box, "header" );
l->setMinimumSize( l->sizeHint() );
b->addWidget( l );
QFrame * f = new QFrame( box, "horizontal divider" );
f->setFrameStyle( QFrame::HLine | QFrame::Sunken );
f->setMinimumHeight( 12 );
b->addWidget( f );
QGridLayout *grid = new QGridLayout( 3, 2 );
b->addLayout( grid );
// here we start on the input grid, with labels and other widget
// neatly arranged. the variable names are reused all over the
// place.
QComboBox * model = new QComboBox( FALSE, box, "model selection" );
model->insertItem( "Type 1 Beetle" );
model->insertItem( "Camper" );
model->insertItem( "Van" );
model->insertItem( "Fastback" );
model->insertItem( "Squareback" );
model->insertItem( "Notchback" );
model->insertItem( "411" );
model->setCurrentItem( model->count() - 1 ); // I like the 411
currentModel = "411";
model->insertItem( "412" );
model->insertItem( "Karmann Ghia" );
model->insertItem( "Thing" );
model->insertItem( "Safari" );
model->insertItem( "Kubelwagen" );
model->insertItem( "Trekker" );
model->insertItem( "Baja" );
model->setMinimumSize( model->sizeHint() );
model->setMaximumHeight( model->minimumSize().height() );
grid->addWidget( model, 0, 1 );
l = new QLabel( model, "Model:", box, "model label" );
l->setMinimumSize( l->sizeHint() );
grid->addWidget( l, 0, 0 );
QSpinBox * motor = new QSpinBox( 1000, 1600, 100,
box, "motor size selection" );
motor->setValue( 1000 );
currentMotorSize = 1000;
motor->setMinimumSize( motor->sizeHint() );
motor->setMaximumHeight( motor->minimumSize().height() );
grid->addWidget( motor, 1, 1 );
l = new QLabel( motor, "Motor size (cc):", box, "motor size label" );
l->setMinimumSize( l->sizeHint() );
grid->addWidget( l, 1, 0 );
QSpinBox * year = new QSpinBox( box, "model year" );
year->setRange( 1949, 1981 );
year->setValue( 1949 );
currentYear = 1949;
year->setMinimumSize( year->sizeHint() );
year->setMaximumHeight( year->minimumSize().height() );
grid->addWidget( year, 2, 1 );
l = new QLabel( year, "Year:", box, "model year label" );
l->setMinimumSize( l->sizeHint() );
grid->addWidget( l, 2, 0 );
b->addStretch( 1 );
b->activate();
// output box
box = new QGroupBox( this, "output box" );
hb->addWidget( box, 0 );
b = new QVBoxLayout( box, 12 );
l = new QLabel( "Resulting Limousine:", box, "header" );
l->setMinimumSize( l->sizeHint() );
b->addWidget( l );
f = new QFrame( box, "horizontal divider" );
f->setFrameStyle( QFrame::HLine | QFrame::Sunken );
f->setMinimumHeight( 12 );
b->addWidget( f );
l = new QLabel( box, "output label" );
l->setAlignment( AlignTop | AlignLeft | WordBreak );
l->setText( "No VW selected yet." );
b->addWidget( l, 1 );
b->addStretch( 1 );
b->activate();
hb->activate();
// set up connections
connect( model, SIGNAL(activated(const QString&)),
this, SLOT(modelSelected(const QString&)) );
connect( motor, SIGNAL(valueChanged(int)),
this, SLOT(motorSelected(int)) );
connect( year, SIGNAL(valueChanged(int)),
this, SLOT(yearSelected(int)) );
connect( this, SIGNAL(validSelectionMade(const QString&)),
l, SLOT(setText(const QString&)) );
}
VW::~VW()
{
// nothing needs to be done.
}
void VW::modelSelected( const QString& m )
{
currentModel = m;
computeSelection();
}
void VW::motorSelected( int m )
{
currentMotorSize = m;
computeSelection();
}
void VW::yearSelected( int y )
{
currentYear = y;
computeSelection();
}
void VW::computeSelection()
{
if ( currentModel.isNull() )
return; // no model selected yet
QString s;
s.sprintf( "You have selected a Wolkswagen %s model %d with a "
"%d cm³ motor.\n\nGood choice!",
(const char *)currentModel,
(int)currentYear, currentMotorSize );
emit validSelectionMade( s );
}
Main:
/****************************************************************************
** $Id: qt/examples/validator/main.cpp 2.2.1 edited 2000-08-31 $
**
** Copyright (C) 1992-2000 Trolltech AS. 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 <qapplication.h>
#include "vw.h"
int main( int argc, char ** argv ) {
QApplication a( argc, argv );
VW mw;
a.setMainWidget( &mw );
mw.setCaption( "" );
mw.show();
return a.exec();
}
Copyright © 2000 Trolltech | Trademarks
| Qt version 2.2.1
|