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.