Mam QLineEdit
gdzie użytkownik powinien wprowadzać tylko liczby.
Czy jest więc ustawienie tylko dla liczb QLineEdit
?
QLineEdit::setValidator()
, na przykład:
myLineEdit->setValidator( new QIntValidator(0, 100, this) );
lub
myLineEdit->setValidator( new QDoubleValidator(0, 100, 2, this) );
Zobacz: QIntValidator , QDoubleValidator , QLineEdit :: setValidator
3.14e-7
.).QDoubleSpinBox
nie akceptuje liczb w notacji naukowej (Qt 5.5).Najlepsze jest
QSpinBox
.I do podwójnej wartości
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)));
źródło
Walidator Regex
Jak dotąd inne odpowiedzi dostarczają rozwiązań tylko dla stosunkowo skończonej liczby cyfr. Jeśli jednak obawiasz się dowolnej lub zmiennej liczby cyfr, możesz użyć a
QRegExpValidator
, przekazując wyrażenie regularne, które akceptuje tylko cyfry (jak zauważył komentarz użytkownika2962533 ). Oto minimalny, kompletny przykład:#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(); }
QRegExpValidator
Ma swoje zalety (i to tylko mało powiedziane). Pozwala na kilka innych przydatnych walidacji: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".
Więcej zachowania podczas edycji w trybie on-line
Zgodnie z dokumentacją :
W ten sposób edycja linii pozwoli użytkownikowi wprowadzić cyfry, nawet jeśli minimalna kwota nie została jeszcze osiągnięta. Na przykład, nawet jeśli użytkownik nie wprowadził żadnego tekstu w odniesieniu do wyrażenia regularnego
"[0-9]{3,}"
(co wymaga co najmniej 3 cyfr), edycja liniowa nadal umożliwia użytkownikowi wpisanie danych wejściowych, aby osiągnąć to minimalne wymaganie. Jeśli jednak użytkownik zakończy edycję bez spełnienia wymogu „co najmniej 3 cyfr”, dane wejściowe będą nieprawidłowe ; sygnałyreturnPressed()
ieditingFinished()
nie będą emitowane.Jeśli wyrażenie regularne miało ograniczenie maksymalne (np.
"[0-1]{,4}"
), To edycja linii zatrzyma wszelkie dane wejściowe powyżej 4 znaków. Dodatkowo, dla zestawów znaków (czyli[0-9]
,[0-1]
,[0-9A-F]
itp) Linia-edit pozwala tylko znaki z danego zestawu mają być wprowadzone.Zauważ, że przetestowałem to tylko z Qt 5.11 na macOS, a nie w innych wersjach Qt lub systemach operacyjnych. Ale biorąc pod uwagę schemat wieloplatformowy Qt ...
Demo: Regex Validators Showcase
źródło
Możesz również ustawić
inputMask
:QLineEdit.setInputMask("9")
Pozwala to użytkownikowi wpisać tylko jedną cyfrę z zakresu od
0
do9
. Użyj wielu9
znaków, aby umożliwić użytkownikowi wprowadzenie wielu liczb. Zobacz także pełną listę znaków, których można użyć w masce wprowadzania .(Moja odpowiedź jest w Pythonie, ale nie powinno być trudno ją przekształcić w C ++)
źródło
Dlaczego nie używasz
QSpinBox
do tego celu? Możesz ustawić przyciski góra / dół jako niewidoczne za pomocą następującego wiersza kodów:// ... QSpinBox* spinBox = new QSpinBox( this ); spinBox->setButtonSymbols( QAbstractSpinBox::NoButtons ); // After this it looks just like a QLineEdit. //...
źródło
Jeśli używasz QT Creator 5.6, możesz to zrobić w następujący sposób:
#include <QIntValidator> ui->myLineEditName->setValidator( new QIntValidator);
Polecam umieścić tę linię po u-> setupUi (this);
Mam nadzieję, że to pomoże.
źródło
new QIntValidator(this)
, w przeciwnym razie obiekt walidatora wycieknie, gdy tylko widget wyjdzie poza zakres.