Настройте QLineEdit на прием только чисел


85

У меня есть, QLineEditгде пользователь должен вводить только числа.

Так есть ли настройка только для цифр QLineEdit?

Ответы:


136

QLineEdit::setValidator(), например:

myLineEdit->setValidator( new QIntValidator(0, 100, this) );

или же

myLineEdit->setValidator( new QDoubleValidator(0, 100, 2, this) );

См .: QIntValidator , QDoubleValidator , QLineEdit :: setValidator


4
Можно ли это сделать из Qt Designer или только с помощью кода?
sashoalm

2
Насколько мне известно, в дизайнере это невозможно сделать.
Крис

Это быстрое решение, если вам нужен ввод в экспоненциальной нотации (например, 3.14e-7). QDoubleSpinBoxне принимает числа в экспоненциальном представлении (Qt 5.5).
Frederik Aalund 01

Если я поставлю (1,100), он все равно будет принимать 0 как вход. Кроме того, я могу писать 0 бесконечно (а не трижды) !!
McLan

2
См. Также QRegExpValidator с QRegExp ("[0-9] *").
user2962533

29

Лучшее QSpinBox.

И для двойного использования 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)));

2
Даже если OP хочет работать с QLineEdit, использование QSpinBox, безусловно, лучший подход.
DrHaze

2
Это работает, когда диапазон номеров небольшой. Подумайте о том, что вы, возможно, захотите использовать этот виджет целую вечность или идентификатор.
Стив

есть ли способ сделать счетчик более удобным для клавиатуры для работы только с цифровыми клавишами, десятичным разделителем и обратным пространством?
Micka

13

Валидатор регулярных выражений

Пока что другие ответы предоставляют решения только для относительно конечного числа цифр. Однако, если вас интересует произвольное или переменное количество цифр, вы можете использовать a QRegExpValidator, передавая регулярное выражение, которое принимает только цифры (как указано в комментарии пользователя 2962533 ). Вот минимальный полный пример:

#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него есть свои достоинства (и это еще не все). Это позволяет выполнять множество других полезных проверок:

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

Подробнее о поведении редактирования в Интернете

Согласно документации :

Обратите внимание, что если в строке редактирования установлен валидатор, сигналы returnPressed () / EditFinished () будут выдаваться только в том случае, если валидатор возвращает QValidator :: Acceptable.

Таким образом, редактирование строки позволит пользователю вводить цифры, даже если минимальная сумма еще не достигнута. Например, даже если пользователь не ввел какой-либо текст против регулярного выражения "[0-9]{3,}"(для которого требуется не менее 3 цифр), редактирование строки по-прежнему позволяет пользователю вводить ввод для достижения этого минимального требования. Однако, если пользователь завершит редактирование, не удовлетворив требование «минимум 3 цифры», ввод будет недопустимым ; сигналы returnPressed()и editingFinished()не будут испускаться.

Если у регулярного выражения была максимальная граница (например "[0-1]{,4}"), то редактирование строки остановит любой ввод после 4 символов. Кроме того, для наборов символов (то есть [0-9], [0-1], [0-9A-F]и т.д.) линия-редактирование позволяет только символы из этого конкретного набора должны быть введены.

Обратите внимание, что я тестировал это только с Qt 5.11 на macOS, но не на других версиях Qt или операционных системах. Но учитывая кроссплатформенную схему Qt ...

Демонстрация: демонстрация валидаторов регулярных выражений


8

Вы также можете установить inputMask:

QLineEdit.setInputMask("9")

Это позволяет пользователю вводить только одну цифру в диапазоне от 0до 9. Используйте несколько 9, чтобы позволить пользователю вводить несколько чисел. См. Также полный список символов, которые можно использовать в маске ввода .

(Мой ответ на Python, но преобразовать его в C ++ не составит труда)


7

Почему бы вам не использовать QSpinBoxдля этой цели? Вы можете сделать кнопки вверх / вниз невидимыми с помощью следующей строки кодов:

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

-1

Если вы используете QT Creator 5.6, вы можете сделать это следующим образом:

#include <QIntValidator>

ui->myLineEditName->setValidator( new QIntValidator);

Я рекомендую вам поместить эту строку после ui-> setupUi (this);

Надеюсь, это поможет.


8
Ваш конструктор должен быть вызван new QIntValidator(this), иначе объект валидатора выйдет из строя, как только ваш виджет выйдет за пределы области видимости.
Alexandros
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.