Stellen Sie QLineEdit so ein, dass nur Zahlen akzeptiert werden

83

Ich habe eine, QLineEditwo der Benutzer nur Zahlen eingeben sollte.

Gibt es also eine Nur-Zahlen-Einstellung für QLineEdit?

Sashoalm
quelle

Antworten:

135

QLineEdit::setValidator(), zum Beispiel:

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

oder

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

Siehe: QIntValidator , QDoubleValidator , QLineEdit :: setValidator

Chris
quelle
4
Kann dies über Qt Designer erfolgen oder ist dies nur über Code möglich?
Sashoalm
2
Meines Wissens gibt es keine Möglichkeit, dies im Designer zu tun.
Chris
Dies ist eine schnelle Lösung, wenn Sie Eingaben in wissenschaftlicher Notation benötigen (z 3.14e-7. B. ). QDoubleSpinBoxakzeptiert keine Zahlen in wissenschaftlicher Notation (Qt 5.5).
Frederik Aalund
Wenn ich (1.100) setze, akzeptiert es immer noch 0 als Eingabe. Außerdem kann ich 0 auf unbestimmte Zeit schreiben (nicht nur dreimal) !!
McLan
2
Siehe auch QRegExpValidator mit QRegExp ("[0-9] *").
user2962533
28

Das Beste ist QSpinBox.

Und für einen doppelten Wert verwenden 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)));
ImmortalPC
quelle
2
Selbst wenn das OP mit einem QLineEdit arbeiten möchte, ist die Verwendung einer QSpinBox definitiv der beste Ansatz.
DrHaze
2
Dies funktioniert, wenn der Nummernkreis klein ist. Denken Sie daran, dass Sie dieses Widget möglicherweise für Alter oder ID verwenden möchten.
Steve
Gibt es eine Möglichkeit, die Spinbox tastaturfreundlicher zu gestalten, um nur mit Zifferntasten, Dezimaltrennzeichen und Rücktaste zu arbeiten?
Micka
10

Der Regex-Validator

Bisher bieten die anderen Antworten Lösungen für nur eine relativ begrenzte Anzahl von Ziffern. Wenn Sie sich jedoch mit einer beliebigen oder variablen Anzahl von Ziffern befassen , können Sie a verwenden QRegExpValidatorund einen regulären Ausdruck übergeben , der nur Ziffern akzeptiert (wie im Kommentar von user2962533 angegeben ). Hier ist ein minimales, vollständiges Beispiel:

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

Das QRegExpValidatorhat seine Vorzüge (und das ist nur eine Untertreibung). Es ermöglicht eine Reihe weiterer nützlicher Validierungen:

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

Weitere Informationen zum Online-Bearbeitungsverhalten

Laut Dokumentation :

Beachten Sie, dass die Signale returnPressed () / editingFinished () nur ausgegeben werden, wenn in der Zeilenbearbeitung ein Validator festgelegt ist, wenn der Validator QValidator :: Acceptable zurückgibt.

Somit ermöglicht die Zeilenbearbeitung dem Benutzer die Eingabe von Ziffern, selbst wenn der Mindestbetrag noch nicht erreicht wurde. Selbst wenn der Benutzer keinen Text für den regulären Ausdruck eingegeben hat "[0-9]{3,}"(für den mindestens 3 Ziffern erforderlich sind), kann der Benutzer bei der Zeilenbearbeitung dennoch Eingaben eingeben, um diese Mindestanforderung zu erreichen . Wenn der Benutzer die Bearbeitung jedoch beendet, ohne die Anforderung von "mindestens 3 Ziffern" zu erfüllen, ist die Eingabe ungültig . die Signale returnPressed()und editingFinished()werden nicht ausgegeben.

Wenn der reguläre Ausdruck eine maximale Grenze hatte (z. B. "[0-1]{,4}"), stoppt die Zeilenbearbeitung jede Eingabe nach 4 Zeichen. Zusätzlich wird für Zeichensätze (dh [0-9], [0-1], [0-9A-F]usw.) die Line-Bearbeitung erlaubt nur Zeichen von diesem bestimmten Satz eingegeben werden.

Beachten Sie, dass ich dies nur mit Qt 5.11 unter einem MacOS getestet habe, nicht mit anderen Qt-Versionen oder Betriebssystemen. Aber angesichts des plattformübergreifenden Schemas von Qt ...

Demo: Regex Validators Showcase

TrebledJ
quelle
8

Sie können auch Folgendes festlegen inputMask:

QLineEdit.setInputMask("9")

Dadurch kann der Benutzer nur eine Ziffer von 0bis eingeben 9. Verwenden Sie mehrere 9, damit der Benutzer mehrere Zahlen eingeben kann. Siehe auch die vollständige Liste der Zeichen, die in einer Eingabemaske verwendet werden können .

(Meine Antwort ist in Python, aber es sollte nicht schwer sein, es in C ++ umzuwandeln.)

Stefan van den Akker
quelle
7

Warum benutzt du nicht ein QSpinBoxfür diesen Zweck? Sie können die Auf- / Ab-Tasten mit der folgenden Codezeile unsichtbar machen:

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

Wenn Sie QT Creator 5.6 verwenden, können Sie dies folgendermaßen tun:

#include <QIntValidator>

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

Ich empfehle Ihnen, diese Zeile nach ui-> setupUi (this) zu setzen.

Ich hoffe das hilft.

Roberto Sepúlveda Bravo
quelle
8
Ihr Konstruktoraufruf sollte lauten new QIntValidator(this), da sonst das Validator-Objekt ausläuft, sobald Ihr Widget den Gültigkeitsbereich verlässt.
Alexandros