2016-11-04 6 views
1

には、があり、特定の最小値と最大値が設定されています。スピンボックスにフィルターを設定して、ある特定の他の整数で割り切れる数だけを許可する必要があります。これはQIntValidatorの正しいタスクのようです。しかし、私は理解していない:(n mod k == 0)かどうかを確認するためのスピンボックスのバリデータを実装する方法は?

  • 数が2〜4桁の数字を有していてもよく、その数は、ユーザーが完全に入力されるまで、何の決定がなされないことができることを考えると、IntermediateとするときAcceptableを返すようにする場合

  • 最小値と最大値の設定方法:現在、それぞれsetMinimumValue()setMaximumValue()を使用して設定しています。この点でバリデーターの変更をインストールするのは何ですか?

数値は負でも正でもかまいません。

答えて

2

QSpinBoxは、基本クラスQAbstractSpinBoxから継承したvalidateメソッドの独自の実装を持っています。たとえばQIntValidatorを使用してこのメ​​ソッドの動作をカスタマイズする場合は、サブクラスでQSpinBoxをサブクラス化し、サブクラスでvalidateメソッドを再実装する必要があります。

必要な論理(ある特定の整数で割り切れる数のみを許容)はQIntValidatorの機能を超えています。指定された文字列を指定された範囲内の整数に変換できるかどうか、または指定された文字列をそのような整数に変換可能に拡張できるかどうか(Intermediate状態)だけです。あなたが最初QIntValidator::validateを呼び出し、それがInvalid状態を返した場合、ので、あなたの方法を行います。

は、私はあなたのQSpinBoxサブクラスvalidateメソッドの実装内でプリプロセッサとしてQIntValidatorを使用することができると思います。しかし、それはIntermediateまたはAcceptableを返す場合、自分で続行する必要があります。

  1. は、入力文字列を取り、整数に変換しよう - おそらく QString::toInt十分です。
  2. 受信した整数を調べ、それが他の整数で割り切れるかどうかを決定する独自の論理をエンコードします。はいの場合、メソッドはAcceptable状態を返します。そうでない場合は、この整数を許容可能にするために「拡張」できるかどうかを何らかの形で把握する必要があります。たとえば、数字は2〜4文字の長さにすることができます。つまり、数字の1,2,3桁のうち少なくとも一部を拡張して受け入れられるようにすることができます。処理された整数がそのようなサブセットに属する場合、メソッドはIntermediateを返します。そうでない場合はInvalidを返します。最小/最大値について

QSpinBoxsetMinimumsetMaximum方法は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 
} 
関連する問題