QSpinBox
は、基本クラスQAbstractSpinBox
から継承したvalidate
メソッドの独自の実装を持っています。たとえばQIntValidator
を使用してこのメソッドの動作をカスタマイズする場合は、サブクラスでQSpinBox
をサブクラス化し、サブクラスでvalidate
メソッドを再実装する必要があります。
必要な論理(ある特定の整数で割り切れる数のみを許容)はQIntValidator
の機能を超えています。指定された文字列を指定された範囲内の整数に変換できるかどうか、または指定された文字列をそのような整数に変換可能に拡張できるかどうか(Intermediate
状態)だけです。あなたが最初QIntValidator::validate
を呼び出し、それがInvalid
状態を返した場合、ので、あなたの方法を行います。
は、私はあなたのQSpinBox
サブクラスvalidate
メソッドの実装内でプリプロセッサとしてQIntValidator
を使用することができると思います。しかし、それはIntermediate
またはAcceptable
を返す場合、自分で続行する必要があります。
- は、入力文字列を取り、整数に変換しよう - おそらく
QString::toInt
十分です。
- 受信した整数を調べ、それが他の整数で割り切れるかどうかを決定する独自の論理をエンコードします。はいの場合、メソッドは
Acceptable
状態を返します。そうでない場合は、この整数を許容可能にするために「拡張」できるかどうかを何らかの形で把握する必要があります。たとえば、数字は2〜4文字の長さにすることができます。つまり、数字の1,2,3桁のうち少なくとも一部を拡張して受け入れられるようにすることができます。処理された整数がそのようなサブセットに属する場合、メソッドはIntermediate
を返します。そうでない場合はInvalid
を返します。最小/最大値について
:QSpinBox
のsetMinimum
とsetMaximum
方法はQSpinBox::validate
が入力をチェックするために使用する範囲を定義します。あなたはQSpinBox
サブクラスのvalidate
方法の初めにQIntValidator
を使用しての私の提案に従っている場合は、それぞれ底部および頂部の特性QIntValidator
年代にこれらの最小値と最大値を設定する必要があります。
class MySpinBox: public QSpinBox
{
<...>
};
QValidator::State MySpinBox::validate(QString &text, int &pos) const
{
QIntValidator validator;
validator.setBottom(minimum());
validator.setTop(maximum());
QValidator::State state = validator.validate(text, pos);
if (state == QValidator::Invalid) {
return state;
}
<...> // Otherwise proceed with your own logics
}
を