Ich habe eine, QLineEdit
wo der Benutzer nur Zahlen eingeben sollte.
Gibt es also eine Nur-Zahlen-Einstellung für QLineEdit
?
Antworten:
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
3.14e-7
. B. ). QDoubleSpinBox
akzeptiert keine Zahlen in wissenschaftlicher Notation (Qt 5.5).
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)));
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 QRegExpValidator
und 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 QRegExpValidator
hat 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 ...
Sie können auch Folgendes festlegen inputMask
:
QLineEdit.setInputMask("9")
Dadurch kann der Benutzer nur eine Ziffer von 0
bis 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.)
Warum benutzt du nicht ein QSpinBox
fü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.
//...
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.
new QIntValidator(this)
, da sonst das Validator-Objekt ausläuft, sobald Ihr Widget den Gültigkeitsbereich verlässt.