У мене є 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".
Більше Онлайн-редагування поведінки
Відповідно до документації :
Зверніть увагу, що якщо для редагування рядка встановлений валідатор, сигнали returnPress () / editingFinished () будуть видаватися лише в тому випадку, якщо валідатор повертає 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)
, інакше об’єкт валідатора витече, як тільки ваш віджет вийде із зони дії.