[Kde-devel-es] QSpinBox con valores en coma flotante y el Validador

Nacho Martín Oya nachooya at teleline.es
Mon Jun 28 15:31:30 CEST 2004


Creo que lo que te voy a poner no es la solución al problema que tienes, pero 
por si te siriviese de inspiración a encontrar una solución te adjunto el 
código que usé para solventar el tema de los SpinBox con decimales que use en 
una aplicación. Sólo implementé las funciones que yo necesitaba, así que no 
es gran cosa, pero bueno judga tú mismo:

class DecimalSpinBox : public QSpinBox {

	Q_OBJECT

private:

	int dec;
	int mul;

public:

	DecimalSpinBox (QWidget * parent, const char * name, int _dec) : QSpinBox 
(parent, name) {
		dec=_dec;
		mul= int (pow (10,_dec));
	}

	float fValue () {
		return (float (value ()) / float (mul));
	}
		
	void fSetValue (float value) {
		setValue (int (value*mul));
	}
	
	void fSetRange (float min, float max) {
		setRange (int (min*mul), int (max*mul));
	}
	
	QString mapValueToText (int value) {
		return (QString::number (float (value)/mul, 'f', dec));
	}

	int mapTextToValue (bool *ok) {
		return (int) (mul * text().toFloat(ok));
	}
};


	Espero que te sirva para algo. Un saludo.

El Sábado 27 de Junio de 2004 17:45, Raúl escribió:
>   Estoy intentado generar mi propio QSpinBox para poder tener valores en
>   coma flotante. He pasado por varias versiones y en todas me funciona
>   ese asunto, pero el validador no hay forma de hacerlo funcionar.
>
>   Si pongo un validador del tipo QIntValidator, funciona, pero claro, no
>   puedo escribir "123.345". Si pongo un QDoubleValidator la sensacion
>   que da es que este no esta funcionado
>
>   El ultimo codigo que estoy probando esta sacado directamente de:
>
>   http://webcvs.kde.org/cgi-bin/cvsweb.cgi/kdegraphics/kview/modules/scale/
>   , archivos kfloatspinbox.[cpp|h], ligeramente adaptados para
>   no depender de KDE.
>
>   Tras crear el widget hago mySpinBox1->setRange(-180.0,180.0,1,4); para
>   fijar el valor minimo a -180.0, el maximo a 180, con incrementos de 1
>   en 1 y 4 decimales.
>
>    void MySpinBox::setRange( float minValue, float maxValue, float step,
>                              unsigned int precision )
>    {
>       m_factor = (int)pow( 10.0, (double)precision );
>       m_min = (int)( minValue * m_factor );
>       m_max = (int)( maxValue * m_factor );
>       m_step = (int)( step * m_factor);
>       QSpinBox::setRange( m_min, m_max);
>       setSteps( m_step, m_step * 10 * );
>       if( precision == 0)
>           setValidator( new QIntValidator(m_min, m_max, this));
>       else
>          setValidator( new QDoubleValidator(minValue, maxValue,
> true,this)); }
>
>    El rango si esta funcionado, por que no puedo pasar de 180, y el
>    incremento tambien funciona, pero el validado de datos no se comporta
>    como esperas.
>
>    Se supone que si escribes en el widget 19 y acto seguido intentas
>    poner otro valor, al estar fuera de rango, no deberia dejarte, pero
>    curiosamente si puedo. Puedo poner cualquier valor, eso si, al perder
>    el foco, el widget se pone a su valor maximo de 180.

-- 
*******************************************************************
* Do you want to try my last application?
* http://ktuxcall.sourceforge.net
* http://sourceforge.net/projects/ktuxcall/ 
* http://www.kde-apps.org/content/show.php?content=11732
*******************************************************************


More information about the Kde-devel-es mailing list