web-dev-qa-db-fra.com

Définissez QLineEdit pour n'accepter que des nombres

J'ai une QLineEdit où l'utilisateur ne doit entrer que des chiffres. 

Existe-t-il donc un paramètre de nombre uniquement pour QLineEdit?

66
sashoalm

QLineEdit::setValidator(), par exemple:

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

ou

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

Voir: QIntValidator , QDoubleValidator , QLineEdit :: setValidator

104
Chris

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

Vous pouvez également définir un inputMask :

QLineEdit.setInputMask("9")

Cela permet à l'utilisateur de ne taper qu'un seul chiffre, allant de 0 à 9. Utilisez plusieurs 9 pour permettre à l'utilisateur de saisir plusieurs nombres. Voir aussi la liste complète liste de 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 le transformer en C++)

7

Pourquoi n'utilisez-vous pas une QSpinBox à cette fin? Vous pouvez définir les boutons haut/bas invisibles avec la ligne de codes suivante:

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

Jusqu'à présent, les autres réponses ne proposent des solutions que pour un nombre de chiffres relativement fini . Cependant, si vous êtes préoccupé par un nombre de chiffres arbitraire ou , vous pouvez utiliser un QRegExpValidator , en passant une expression rationnelle n'acceptant que les chiffres (comme indiqué par le commentaire de l'utilisateur2962533 ). Voici un exemple complet et minimaliste:

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

Maintenant, ne vous méprenez pas, le QRegExpValidator a ses avantages (et ce n'est qu'un euphémisme). Cela 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 at least have 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 0 and 1 for a maximum of 4 digits (e.g. for binary).
QRegExp("0x[0-9a-fA-F]")  //  matches a hex 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 rudimentary ip address. Of course, it's rudimentary 
                          //    because you can still enter an invalid address: "999.999.999.999".     

Selon documentation :

Notez que si un validateur est défini sur la ligne à modifier, les signaux returnPressed ()/publishingFinished () ne seront émis que si le validateur renvoie QValidator :: Acceptable.

Ainsi, l'édition en 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 dans l'expression régulière "[0-9]{3,}" (qui nécessite au moins 3 chiffres), la modification de ligne permet toujours à l'utilisateur de saisir une entrée pour atteindre cette exigence minimale . Cependant, une fois que l'utilisateur frappe Enter ou termine l'édition avec zéro, un ou deux chiffres, l'entrée ne sera pas valide.

Si l'expression régulière avait une limite maximale (par exemple, "[0-1]{,4}"), l'édition en ligne arrêtera toute entrée de plus de 4 caractères. De plus, pour les jeux de caractères (à savoir [0-9], [0-1], [0-9A-F], etc.), l'édition en ligne permet uniquement aux caractères de de cet ensemble particulier d'être entrés.

Notez que je l’ai seulement testé avec Qt 5.11 sur un macOS, et non sur d’autres versions de Qt ou systèmes d’exploitation. Mais étant donné le schéma multi-plateforme de Qt ...

Fini la diatribe.

Aussi, juste pour le plaisir, J'ai écrit un widget présentant les validateurs d’expression rationnelle ci-dessus .

2
TrebledJ