Встановіть QLineEdit для прийому лише цифр


83

У мене є QLineEditде користувач повинен вводити лише цифри.

Тож чи існує параметр лише для цифр QLineEdit?

Відповіді:


135

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

Якщо я поставлю (1100), він все одно прийме 0 як вхід. До того ж я можу писати 0 нескінченно (не лише три рази) !!
— McLan

2
Див. Також QRegExpValidator з QRegExp ("[0-9] *").
— user2962533

28

Найкраще 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
Навіть якщо операційна програма хоче працювати з QLineEdit, використання QSpinBox, безумовно, є найкращим підходом.
— DrHaze

2
Це працює, коли діапазон номерів невеликий. Подумайте, що вам може знадобитися використовувати цей віджет віками чи ідентифікатором.
— Стів

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

12

Засіб перевірки регулярних виразів

Поки що інші відповіді дають рішення лише щодо відносно кінцевої кількості цифр. Однак, якщо вас турбує довільна або змінна кількість цифр, ви можете використовувати 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 ...

Демонстрація: вітрина перевірки регулярних виразів


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), інакше об’єкт валідатора витече, як тільки ваш віджет вийде із зони дії.
— Александрос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.