Ustaw QLineEdit tak, aby akceptował tylko liczby

84

Mam QLineEditgdzie użytkownik powinien wprowadzać tylko liczby.

Czy jest więc ustawienie tylko dla liczb QLineEdit?

sashoalm
źródło

Odpowiedzi:

135

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

Chris
źródło
4
Czy można to zrobić z Qt Designer, czy jest to możliwe tylko za pomocą kodu?
sashoalm
2
O ile wiem, w projektancie nie ma takiej możliwości.
Chris
Jest to szybkie rozwiązanie, jeśli potrzebujesz danych wejściowych podanych w notacji naukowej (np 3.14e-7.). QDoubleSpinBoxnie akceptuje liczb w notacji naukowej (Qt 5.5).
Frederik Aalund
Jeśli wstawię (1,100), nadal będzie akceptować 0 jako dane wejściowe. Poza tym mogę pisać 0 w nieskończoność (nie tylko trzy razy) !!
McLan
2
Zobacz także QRegExpValidator z QRegExp („[0-9] *”).
user2962533
29

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)));
ImmortalPC
źródło
2
Nawet jeśli OP chce pracować z QLineEdit, użycie QSpinBox jest zdecydowanie najlepszym podejściem.
DrHaze
2
Działa to, gdy zakres liczb jest mały. Pomyśl o tym, że możesz chcieć używać tego widżetu przez lata lub identyfikator.
Steve
jakikolwiek sposób, aby spinbox był bardziej przyjazny dla klawiatury, aby działał tylko z klawiszami numerycznymi, separatorem dziesiętnym i cofnięciem?
Micka
13

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

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

Demo: Regex Validators Showcase

TrebledJ
źródło
8

Możesz również ustawić inputMask:

QLineEdit.setInputMask("9")

Pozwala to użytkownikowi wpisać tylko jedną cyfrę z zakresu od 0do 9. Użyj wielu 9znakó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 ++)

Stefan van den Akker
źródło
7

Dlaczego nie używasz QSpinBoxdo 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.
//...
świnia
źródło
-1

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.

Roberto Sepúlveda Bravo
źródło
8
Twoje wywołanie konstruktora powinno być new QIntValidator(this), w przeciwnym razie obiekt walidatora wycieknie, gdy tylko widget wyjdzie poza zakres.
Alexandros