Mam QLineEdit
gdzie użytkownik powinien wprowadzać tylko liczby.
Czy jest więc ustawienie tylko dla liczb QLineEdit
?
Odpowiedzi:
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)));
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ą :
Zauważ, że jeśli w wierszu edit ustawiony jest walidator, sygnały returnPressed () / editFinished () będą emitowane tylko wtedy, gdy walidator zwróci QValidator :: Acceptable.
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ły returnPressed()
i editingFinished()
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 ...
Możesz również ustawić inputMask
:
QLineEdit.setInputMask("9")
Pozwala to użytkownikowi wpisać tylko jedną cyfrę z zakresu od 0
do 9
. Użyj wielu 9
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 ++)
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.
//...
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.
new QIntValidator(this)
, w przeciwnym razie obiekt walidatora wycieknie, gdy tylko widget wyjdzie poza zakres.