Встановіть 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.