107 votes

Configurer QLineEdit pour qu'il n'accepte que les nombres

J'ai un QLineEdit où l'utilisateur ne doit saisir que des chiffres.

Alors, existe-t-il un paramètre uniquement numérique pour QLineEdit ?

161voto

Chris Points 7557

QLineEdit::setValidator() par exemple :

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

ou

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

Voir : QIntValidateur , QDoubleValidator , QLineEdit::setValidator

28voto

ImmortalPC Points 628

Le meilleur est QSpinBox .

Et pour une valeur double, utilisez 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)));

20voto

TrebledJ Points 7190

Le validateur Regex

Jusqu'à présent, les autres réponses n'ont fourni des solutions que pour un nombre relativement limité de cas. finie le nombre de chiffres. Toutefois, si vous êtes concerné par un arbitraire ou un variable nombre de chiffres, vous pouvez utiliser un QRegExpValidator en passant une regex qui n'accepte que les chiffres (comme indiqué par Commentaire de user2962533 ). Voici un exemple minimal et complet :

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

Le site QRegExpValidator a ses mérites (et ce n'est qu'un euphémisme). Il permet un tas d'autres validations utiles :

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".     

Plus sur le comportement de l'édition en ligne

Selon documentation :

Notez que si un validateur est défini pour l'édition de la ligne, les signaux returnPressed()/editingFinished() ne seront émis que si le validateur renvoie QValidator::Acceptable.

Ainsi, l'édition de la ligne permettra à l'utilisateur de saisir des chiffres même si le montant minimum n'a pas encore été atteint. Par exemple, même si l'utilisateur n'a pas saisi de texte par rapport à la regex "[0-9]{3,}" (qui nécessite au moins 3 chiffres), l'édition de ligne permet toujours à l'utilisateur de saisir des données à atteindre cette exigence minimale. Toutefois, si l'utilisateur termine l'édition sans satisfaire à l'exigence "au moins 3 chiffres", l'entrée sera la suivante invalide ; les signaux returnPressed() y editingFinished() ne sera pas émise.

Si la regex avait une limite maximale (par ex. "[0-1]{,4}" ), alors l'édition de ligne arrêtera toute saisie au-delà de 4 caractères. De plus, pour les jeux de caractères (i.e. [0-9] , [0-1] , [0-9A-F] etc.), l'édition de ligne n'autorise que les caractères de l'option cet ensemble particulier à saisir.

Notez que je n'ai testé ceci qu'avec Qt 5.11 sur un macOS, pas sur d'autres versions de Qt ou systèmes d'exploitation. Mais étant donné le schéma multiplateforme de Qt...

Démonstration : <a href="https://github.com/TrebledJ/Qt-Examples/tree/master/%5Bwidgets%5D--regex-validators" rel="noreferrer">Vitrine des validateurs Regex</a>

13voto

Neftas Points 1026

Vous pouvez également définir un inputMask :

QLineEdit.setInputMask("9")

Cela permet à l'utilisateur de ne taper qu'un seul chiffre compris entre 0 et 10. 0 à 9 . Utilisez plusieurs 9 pour permettre à l'utilisateur de saisir plusieurs chiffres. Voir également la version complète de liste des caractères pouvant être utilisés dans un masque de saisie .

(Ma réponse est en Python, mais il ne devrait pas être difficile de la transformer en C++)

7voto

p.i.g. Points 2569

Pourquoi n'utilisez-vous pas un QSpinBox à cette fin ? Vous pouvez rendre les boutons haut/bas invisibles avec la ligne de code suivante :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X