숫자 만 허용하도록 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 2014 년

2
내 지식으로는 디자이너에서 이것을 할 방법이 없습니다.
— Chris

과학적 표기법 (예 :)으로 입력해야하는 경우 빠른 솔루션 3.14e-7입니다. QDoubleSpinBox과학적 표기법 (Qt 5.5)의 숫자를 허용하지 않습니다.
— Frederik Aalund

(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
이것은 숫자 범위가 작을 때 작동합니다. 연령이나 ID에이 위젯을 사용하고 싶을 수도 있습니다.
— Steve

숫자 키, 소수점 구분 기호 및 백 스페이스로만 작동하도록 스핀 상자를 키보드 친화적으로 만드는 방법이 있습니까?
— Micka

13

정규식 검사기

지금까지 다른 답변은 상대적으로 유한 한 자릿수에 대한 솔루션을 제공합니다 . 그러나 임의의 또는 가변적 인 자릿수에 관심이있는 경우 숫자 QRegExpValidator만 허용하는 정규식을 전달하는을 사용할 수 있습니다 ( user2962533의 주석에서 언급 한대로 ). 다음은 최소한의 완전한 예입니다.

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

더 많은 온라인 편집 동작

문서 에 따르면 :

라인 편집에 유효성 검사기가 설정되어 있으면 유효성 검사기가 QValidator :: Acceptable을 반환하는 경우에만 returnPressed () / editingFinished () 신호가 방출됩니다.

따라서 라인 편집을 통해 사용자는 최소 금액에 도달하지 않았더라도 숫자를 입력 할 수 있습니다. 예를 들어 사용자가 정규식 "[0-9]{3,}"(최소 3 자리 필요)에 대해 텍스트를 입력하지 않은 경우에도 줄 편집을 통해 사용자 는 최소 요구 사항 에 도달 하기 위해 입력을 입력 할 수 있습니다 . 그러나 사용자가 "최소 3 자리"요구 사항을 충족하지 않고 편집을 마치면 입력이 유효하지 않습니다 . 신호 returnPressed()및이 editingFinished()방출되지 않는다.

정규식에 최대 제한 (예 :)이있는 경우 "[0-1]{,4}"라인 편집은 4자를 초과하는 모든 입력을 중지합니다. 또한, 문자 집합 (예를 위해 [0-9], [0-1], [0-9A-F], 등) 라인 편집 만의 문자 수 있습니다 특정 세트를 입력 할 수 있습니다.

다른 Qt 버전이나 운영 체제가 아닌 macOS의 Qt 5.11에서만 이것을 테스트했습니다. 그러나 Qt의 크로스 플랫폼 스키마가 주어지면 ...

데모 : Regex Validators Showcase



7

QSpinBox이 목적으로 a 를 사용하지 않는 이유는 무엇 입니까? 다음 코드 줄에서 보이지 않는 위 / 아래 버튼을 설정할 수 있습니다.

// ...
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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.