Configure QLineEdit para aceptar solo números

5 minutos de lectura

avatar de usuario
sashoalm

tengo un QLineEdit donde el usuario debe ingresar solo números.

Entonces, ¿hay una configuración de solo números para QLineEdit?

  • QSpinBox como respondido.

    – Chris P.

    22/09/2021 a las 16:32

avatar de usuario
cris

QLineEdit::setValidator()por ejemplo:

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

o

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

Ver: QIntValidator, QDoubleValidator, QLineEdit::establecerValidador

  • ¿Se puede hacer esto desde Qt Designer, o solo es posible a través del código?

    – sashoalm

    25 de marzo de 2014 a las 14:06

  • Que yo sepa, no hay forma de hacer esto en el diseñador.

    – Chris

    04/04/2014 a las 14:42

  • Esta es una solución rápida si necesita una entrada dada en notación científica (p. ej., 3.14e-7). QDoubleSpinBox no acepta números en notación científica (Qt 5.5).

    – Federico Aalund

    1 de septiembre de 2015 a las 12:22

  • Si pongo (1,100), todavía aceptará 0 como entrada. Además, ¡puedo escribir 0 indefinidamente (no solo tres veces)!

    – McLan

    14 de diciembre de 2015 a las 18:14

  • Ver también QRegExpValidator con QRegExp(“[0-9]*”).

    – usuario2962533

    15 de junio de 2016 a las 9:28

avatar de usuario
InmortalPC

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)));

  • Incluso si el OP quiere trabajar con un QLineEdit, usar un QSpinBox es definitivamente el mejor enfoque.

    – DrHaze

    24 de febrero de 2015 a las 14:12

  • Esto funciona cuando el rango de números es pequeño. Piense en que es posible que desee utilizar este widget para las edades o la identificación.

    –Steve

    7 de junio de 2016 a las 9:34

  • ¿Alguna forma de hacer que el cuadro numérico sea más amigable con el teclado para trabajar solo con teclas numéricas, separador decimal y retroceso?

    – Micka

    4 de agosto de 2016 a las 15:47

avatar de usuario
triplicadoJ

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 <QApplication>
#include <QLineEdit>
#include <QRegExpValidator>

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();
}

los 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

De acuerdo a documentación:

Tenga en cuenta que si hay un validador configurado 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 macOS, no en otras versiones o sistemas operativos de Qt. Pero dado el esquema multiplataforma de Qt…

Manifestación: Exhibición de validadores Regex

También podría establecer un inputMask:

QLineEdit.setInputMask("9")

Esto le permite al usuario escribir solo un dígito que va desde 0 a 9. Usar múltiples 9‘s para permitir al usuario ingresar varios números. Ver también el completo lista de caracteres que se pueden utilizar en una máscara de entrada.

(Mi respuesta está en Python, pero no debería ser difícil transformarla a C++)

¿Por qué no usas un QSpinBox para este propósito ? Puede configurar los botones arriba/abajo invisibles con la siguiente línea de códigos:

// ...
QSpinBox* spinBox = new QSpinBox( this );
spinBox->setButtonSymbols( QAbstractSpinBox::NoButtons ); // After this it looks just like a QLineEdit.
//...

  • Tenga en cuenta que NoButons en realidad no elimina los botones, solo los hace del mismo color que el fondo del QSpinBox. Entonces, en ciertos estilos donde las flechas son grandes, tendrá una parte molestamente más grande del QSpinBox que simplemente se ve en blanco y aplasta el resto del campo de entrada.

    – Miguel

    15 de marzo de 2021 a las 2:49

avatar de usuario
Roberto Sepúlveda Bravo

Si está utilizando QT Creator 5.6, puede hacerlo así:

#include <QIntValidator>

ui->myLineEditName->setValidator( new QIntValidator);

Te recomiendo que pongas esa línea después de ui->setupUi(this);

Espero que esto ayude.

  • Tenga en cuenta que NoButons en realidad no elimina los botones, solo los hace del mismo color que el fondo del QSpinBox. Entonces, en ciertos estilos donde las flechas son grandes, tendrá una parte molestamente más grande del QSpinBox que simplemente se ve en blanco y aplasta el resto del campo de entrada.

    – Miguel

    15 de marzo de 2021 a las 2:49

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad