У меня есть, QLineEdit
где пользователь должен вводить только числа.
Так есть ли настройка только для цифр QLineEdit
?
Ответы:
QLineEdit::setValidator()
, например:
myLineEdit->setValidator( new QIntValidator(0, 100, this) );
или же
myLineEdit->setValidator( new QDoubleValidator(0, 100, 2, this) );
См .: QIntValidator , QDoubleValidator , QLineEdit :: setValidator
3.14e-7
). QDoubleSpinBox
не принимает числа в экспоненциальном представлении (Qt 5.5).
Лучшее 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)));
Валидатор регулярных выражений
Пока что другие ответы предоставляют решения только для относительно конечного числа цифр. Однако, если вас интересует произвольное или переменное количество цифр, вы можете использовать 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 ...
Демонстрация: демонстрация валидаторов регулярных выражений
Вы также можете установить inputMask
:
QLineEdit.setInputMask("9")
Это позволяет пользователю вводить только одну цифру в диапазоне от 0
до 9
. Используйте несколько 9
, чтобы позволить пользователю вводить несколько чисел. См. Также полный список символов, которые можно использовать в маске ввода .
(Мой ответ на Python, но преобразовать его в C ++ не составит труда)
Почему бы вам не использовать QSpinBox
для этой цели? Вы можете сделать кнопки вверх / вниз невидимыми с помощью следующей строки кодов:
// ...
QSpinBox* spinBox = new QSpinBox( this );
spinBox->setButtonSymbols( QAbstractSpinBox::NoButtons ); // After this it looks just like a QLineEdit.
//...
Если вы используете QT Creator 5.6, вы можете сделать это следующим образом:
#include <QIntValidator>
ui->myLineEditName->setValidator( new QIntValidator);
Я рекомендую вам поместить эту строку после ui-> setupUi (this);
Надеюсь, это поможет.
new QIntValidator(this)
, иначе объект валидатора выйдет из строя, как только ваш виджет выйдет за пределы области видимости.