Saltar al contenido

Permitir la entrada en QLineEdit solo dentro del rango de QDoubleValidator

Haz todo lo posible por interpretar el código bien antes de adaptarlo a tu trabajo y si ttienes algo que aportar puedes dejarlo en la sección de comentarios.

Solución:

Eso es porque QDoubleValidator devoluciones QValidator::Intermediate si el valor está fuera de los límites y QLineEdit acepta QValidator::Intermediate valores.

Para implementar el comportamiento que desea, puede crear el suyo QDoubleValidator subclase como esta:

class MyValidator : public QDoubleValidator

public:
    MyValidator(double bottom, double top, int decimals, QObject * parent) :
        QDoubleValidator(bottom, top, decimals, parent)
    
    

    QValidator::State validate(QString &s, int &i) const
    
        if (s.isEmpty()) 
            return QValidator::Intermediate;
        

        bool ok;
        double d = s.toDouble(&ok);

        if (ok && d > 0 && d < 15) 
            return QValidator::Acceptable;
         else 
            return QValidator::Invalid;
        
    
;

ACTUALIZAR: Esto resolverá el problema del signo negativo y también aceptará formatos dobles de configuración regional:

class MyValidator : public QDoubleValidator

public:
    MyValidator(double bottom, double top, int decimals, QObject * parent) :
        QDoubleValidator(bottom, top, decimals, parent)
    
    

    QValidator::State validate(QString &s, int &i) const
    
        if (s.isEmpty() 
;

Es posible hacer esto también sin subclases.

lineEdit = new QLineEdit();
connect(lineEdit,SIGNAL(textChanged(QString)), this, SLOT(textChangedSlot(QString)));

QDoubleValidator *dblVal = new QDoubleValidator(minVal, maxVal, 1000, lineEdit);
dblVal->setNotation(QDoubleValidator::StandardNotation);
dblVal->setLocale(QLocale::C);
lineEdit->setValidator(dblVal);

La configuración de la configuración regional puede ser importante porque define qué caracteres se interpretan como un separador decimal. Formato de la entrada string define qué configuraciones regionales deben usarse.

En textChangedSlot, podemos validar la entrada de esta manera:

QString str = lineEdit->text();
int i = 0;
QDoubleValidator *val = (QDoubleValidator *) lineEdit->validator();
QValidator::State st = val->validate(str, i);

if (st == QValidator::Acceptable) 
    // Validation OK
 else 
    // Validation NOK

En este caso también QValidator :: Intermediate state se interpreta como un caso fallido.

Si conectamos textChanged -signal a textChangedSlot, la validación se realiza después de cada cambio de campo de entrada. También podríamos conectar las señales editFinished () o returnPressed () a la ranura de validación. En ese caso, la validación se realiza solo cuando el usuario deja de editar el string.

Probé la excelente clase anterior y todavía necesita un par de ediciones. La búsqueda de punto decimal estaba reduciendo el rango especificado por "top" porque devolvía un "-1" cuando no hay punto decimal. Agregué una declaración condicional que corrige eso.

Además, aún debe modificarse para el caso en que el usuario intente eliminar el punto decimal y el valor resultante sea mayor que el rango. En este momento simplemente prohíbe ese comportamiento en lugar de cambiarlo al valor máximo que me parece más intuitivo.

class MyValidator : public QDoubleValidator

    public:
    MyValidator(double bottom, double top, int decimals, QObject * parent) :
    QDoubleValidator(bottom, top, decimals, parent)
    
    

    QValidator::State validate(QString &s, int &i) const
    
;

Puntuaciones y reseñas

Tienes la posibilidad difundir esta reseña si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *