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?

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


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

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



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

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


8
Ihr Konstruktoraufruf sollte lauten new QIntValidator(this), da sonst das Validator-Objekt ausläuft, sobald Ihr Widget den Gültigkeitsbereich verlässt.
Alexandros
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.