Saltar al contenido

Configure QLineEdit para aceptar solo números

Joel, parte de este gran equipo de trabajo, nos ha hecho el favor de escribir este tutorial porque conoce perfectamente dicho tema.

Solución:

QLineEdit::setValidator(), por ejemplo:

myLineEdit->setValidator( new QIntValidator(0, 100, this) );

o

myLineEdit->setValidator( new QDoubleValidator(0, 100, 2, this) );

Ver: QIntValidator, QDoubleValidator, QLineEdit::setValidator

El mejor es QSpinBox.

Y para un uso de doble valor QDoubleSpinBox.

QSpinBox myInt;
myInt.setMinimum(-5);
myInt.setMaximum(5);
myInt.setSingleStep(1);// Will increment the current value with 1 (if you use up arrow key) (if you use down arrow key => -1)
myInt.setValue(2);// Default/begining value
myInt.value();// Get the current value
//connect(&myInt, SIGNAL(valueChanged(int)), this, SLOT(myValueChanged(int)));

El validador Regex

Hasta ahora, las otras respuestas brindan soluciones solo para un número relativamente finito número de dígitos. Sin embargo, si le preocupa un arbitrario o un variable número de dígitos que puede utilizar un QRegExpValidator, pasando una expresión regular que solo acepta dígitos (como se indica en el comentario del usuario 2962533). Aquí hay un ejemplo mínimo y completo:

#include 
#include 
#include 

int main(int argc, char *argv[])

    QApplication app(argc, argv);

    QLineEdit le;
    le.setValidator(new QRegExpValidator(QRegExp("[0-9]*"), &le));
    le.show();

    return app.exec();

El QRegExpValidator tiene sus méritos (y eso es solo un eufemismo). Permite un montón de otras validaciones útiles:

QRegExp("[1-9][0-9]*")    //  leading digit must be 1 to 9 (prevents leading zeroes).
QRegExp("\d*")           //  allows matching for unicode digits (e.g. for 
                          //    Arabic-Indic numerals such as ٤٥٦).
QRegExp("[0-9]+")         //  input must have at least 1 digit.
QRegExp("[0-9]8,32")    //  input must be between 8 to 32 digits (e.g. for some basic
                          //    password/special-code checks).
QRegExp("[0-1],4")      //  matches at most four 0s and 1s.
QRegExp("0x[0-9a-fA-F]")  //  matches a hexadecimal number with one hex digit.
QRegExp("[0-9]13")      //  matches exactly 13 digits (e.g. perhaps for ISBN?).
QRegExp("[0-9]1,3\.[0-9]1,3\.[0-9]1,3\.[0-9]1,3")
                          //  matches a format similar to an ip address.
                          //    N.B. invalid addresses can still be entered: "999.999.999.999".     

Más comportamiento de edición en línea

Según la documentación:

Tenga en cuenta que si hay un validador establecido en la edición de línea, las señales returnPressed()/editingFinished() solo se emitirán si el validador devuelve QValidator::Acceptable.

Por lo tanto, la edición de línea permitirá al usuario ingresar dígitos incluso si aún no se ha alcanzado la cantidad mínima. Por ejemplo, incluso si el usuario no ha ingresado ningún texto contra la expresión regular "[0-9]3," (que requiere al menos 3 dígitos), la edición de línea aún permite al usuario escribir la entrada para alcanzar ese requisito mínimo. Sin embargo, si el usuario termina de editar sin cumplir con el requisito de “al menos 3 dígitos”, la entrada sería inválido; las señales returnPressed() y editingFinished() no se emitirá.

Si la expresión regular tenía un límite máximo (por ejemplo, "[0-1],4"), la edición de línea detendrá cualquier entrada que supere los 4 caracteres. Además, para conjuntos de caracteres (es decir, [0-9], [0-1], [0-9A-F], etc.) la edición de línea solo permite caracteres de ese conjunto especial para ser ingresado.

Tenga en cuenta que solo probé esto con Qt 5.11 en un macOS, no en otras versiones o sistemas operativos de Qt. Pero dado el esquema multiplataforma de Qt…

Demostración: escaparate de validadores Regex

Eres capaz de apoyar nuestra función dejando un comentario y valorándolo te damos la bienvenida.

¡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 *