web-dev-qa-db-ja.com

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

ユーザーが数字のみを入力する必要があるQLineEditがあります。

QLineEditには数字のみの設定がありますか?

69
sashoalm

QLineEdit::setValidator()、たとえば:

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

または

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

参照: QIntValidatorQDoubleValidatorQLineEdit :: setValidator

111
Chris

最適なのは 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)));
21
ImmortalPC

この目的でQSpinBoxを使用しないのはなぜですか?次のコード行を使用して、アップ/ダウンボタンを非表示に設定できます。

// ...
QSpinBox* spinBox = new QSpinBox( this );
spinBox->setButtonSymbols( QAbstractSpinBox::NoButtons ); // After this it looks just like a QLineEdit.
//...
7
p.i.g.

inputMask を設定することもできます:

QLineEdit.setInputMask("9")

これにより、ユーザーは0から9までの1桁のみを入力できます。ユーザーが複数の数字を入力できるようにするには、複数の9を使用します。完全な 入力マスクで使用できる文字のリスト も参照してください。

(私の答えはPythonですが、C++に変換するのは難しくないはずです)

正規表現バリデーター

これまでのところ、他の回答は、比較的有限桁の数のみのソリューションを提供します。ただし、任意または変数桁数に関心がある場合は、 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".     

行編集動作の詳細

documentation によると:

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

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

正規表現に最大バインド(たとえば、"[0-1]{,4}")がある場合、行編集は4文字を超える入力を停止します。さらに、文字セット(つまり、[0-9][0-1][0-9A-F]など)の場合、行編集では特定のセットの文字のみが許可されます入力します。

これはmacOS上のQt 5.11でのみテストされており、他のQtバージョンやオペレーティングシステムではテストされていないことに注意してください。しかし、Qtのクロスプラットフォームスキーマを考えると...

デモ: Regex Validators Showcase

3
TrebledJ