it-swarm.com.de

Stellen Sie QLineEdit so ein, dass nur Zahlen akzeptiert werden

Ich habe eine QLineEdit, bei der der Benutzer nur Zahlen eingeben soll. 

Gibt es also nur Zahlen für QLineEdit?

66
sashoalm

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

104
Chris

Das Beste ist QSpinBox .

Und für einen doppelten Wert verwenden Sie 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

Sie können auch eine inputMask einstellen:

QLineEdit.setInputMask("9")

Dadurch kann der Benutzer nur eine Ziffer eingeben, die von 0 bis 9 reicht. Verwenden Sie mehrere 9s, damit der Benutzer mehrere Nummern 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, sie in C++ umzuwandeln.)

Warum verwenden Sie nicht eine QSpinBox für diesen Zweck? Sie können die Auf/Ab-Tasten mit der folgenden Codezeile unsichtbar einstellen:

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

Bisher liefern die anderen Antworten nur Lösungen für eine relativ endliche Anzahl von Ziffern. Wenn Sie sich jedoch mit einer willkürlichen oder einer variablen Anzahl von Ziffern befassen, können Sie ein ) verwenden QRegExpValidatorname __ , wobei ein regulärer Ausdruck übergeben wird, der nur Ziffern akzeptiert (wie von user2962533's comment 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();
}

Versteht mich nicht falsch, der 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 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".     

Laut Dokumentation :

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

Auf diese Weise kann der Benutzer bei der Zeilenbearbeitung auch dann Ziffern eingeben, wenn der Mindestbetrag noch nicht erreicht wurde. Z.B. Selbst wenn der Benutzer keinen Text für den regulären Ausdruck "[0-9]{3,}" eingegeben hat (der mindestens 3 Stellen erfordert), ermöglicht die Zeilenbearbeitung dem Benutzer weiterhin, Eingaben zu machen, um dieses Minimum zu erreichen Anforderung. Sobald jedoch der Benutzer trifft Enter Wenn Sie die Bearbeitung mit null, einer oder zwei Ziffern beenden, ist die Eingabe nicht gültig.

Wenn der reguläre Ausdruck eine maximale Grenze hatte (z. B. "[0-1]{,4}"), stoppt die Zeilenbearbeitung alle Eingaben nach 4 Zeichen. Außerdem können bei Zeichensätzen (d. H. [0-9], [0-1], [0-9A-F] usw.) nur Zeichen aus diesem bestimmten Satz eingegeben werden.

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

Ende schimpfen.

Außerdem habe ich zum Spaß ) ein Widget geschrieben, das die oben genannten Regexp-Validatoren zeigt .

2
TrebledJ