数値のみを受け入れるようにQLineEditを設定します


83

QLineEditユーザーが数字だけを入力する必要がある場所があります。

では、数字のみの設定はありQLineEditますか?

回答:


135

QLineEdit::setValidator()、 例えば:

myLineEdit->setValidator( new QIntValidator(0, 100, this) );

または

myLineEdit->setValidator( new QDoubleValidator(0, 100, 2, this) );

参照:QIntValidatorQDoubleValidatorQLineEdit :: setValidator


4
これはQtDesignerから実行できますか、それともコードを介してのみ可能ですか?
sashoalm 2014年

2
私の知る限り、デザイナーでこれを行う方法はありません。
クリス

これは、科学的記数法で入力する必要がある場合の迅速な解決策です(例:)3.14e-7QDoubleSpinBox科学的記数法の数値は受け入れません(Qt5.5)。
Frederik Aalund 2015

(1,100)を入力しても、入力として0を受け入れます。その上、私は0を無期限に書くことができます(3回だけではありません)!!
マクラン2015

2
QRegExp( "[0-9] *")を使用したQRegExpValidatorも参照してください。
user2962533 2016年

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
OPがQLineEditを使用したい場合でも、QSpinBoxを使用することが間違いなく最善のアプローチです。
DrHaze 2015

2
これは、数値範囲が小さい場合に機能します。このウィジェットを年齢やIDに使用することをお勧めします。
スティーブ

スピンボックスをよりキーボードフレンドリーにして、数字キー、小数点記号、およびバックスペースのみを操作できるようにする方法はありますか?
ミカ2016

11

正規表現バリデーター

これまでのところ、他の回答は、比較的限られた桁数のソリューションしか提供していません。ただし、任意または可変の桁数が必要な場合は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".     

オンライン編集動作の詳細

ドキュメントによると:

行編集にバリデーターが設定されている場合、returnPressed()/ editingFinished()シグナルは、バリデーターがQValidator :: Acceptableを返した場合にのみ発行されることに注意してください。

したがって、行編集により、最小量にまだ達していない場合でも、ユーザーは数字を入力できます。たとえば、ユーザーが正規表現に対してテキストを入力していなくても"[0-9]{3,}"(3桁以上必要)、行編集により、ユーザーは入力を入力しその最小要件に達することができます。ただし、ユーザーが「少なくとも3桁」の要件を満たさずに編集を終了した場合、入力は無効になります。信号returnPressed()editingFinished()は放出されません。

正規表現に最大境界(例"[0-1]{,4}")がある場合、行編集は4文字を超える入力を停止します。また、文字セット(すなわちのために[0-9][0-1][0-9A-F]、など)が行編集のみから文字ができ、その特定のセットが入力されます。

私はこれをmacOSのQt5.11でのみテストし、他の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)。そうしないと、ウィジェットがスコープ外になるとすぐにバリデーターオブジェクトがリークします。
アレクサンドロス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.