2

特定の最小値と最大値が設定された sQSpinBoxを取るaがあります。intスピン ボックスにフィルターを設定して、他の特定の整数で割り切れる数値のみを許可する必要があります。これは にとって適切なタスクのようQIntValidatorです。しかし、私は理解していません:

  • Intermediate数値が 2 桁から 4 桁の場合Acceptable、数値がユーザーによって完全に入力されるまで、決定を下すことはできません。

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

数値は、負の値と正の値の両方にすることができます。

4

1 に答える 1

3

QSpinBoxvalidateには、基本クラスから継承されたメソッドの独自の実装がありQAbstractSpinBoxます。を使用するなどして、このメソッドの動作をカスタマイズする場合は、サブクラスでメソッドをサブクラス化し、それに応じて再実装QIntValidatorする必要があります。QSpinBoxvalidate

あなたが必要とするロジック - 「他の特定の整数で割り切れる数のみを許可する」 - は、QIntValidatorの機能の範囲を超えています。指定された文字列を指定された範囲内で整数に変換できるかどうか、または指定された文字列をそのような整数に変換できるように拡張できるかどうか (Intermediate状態) を指定するだけです。

サブクラスのメソッド実装QIntValidator内でプリプロセッサとして使用できると思います。最初に呼び出し、状態を返す場合はメソッドもそうします。ただし、またはが返された場合は、自分で続行する必要があります。QSpinBoxvalidateQIntValidator::validateInvalidIntermediateAcceptable

  1. 入力文字列を取り、それを整数に変換してみてください - おそらくQString::toInt十分でしょう。
  2. 受信した整数を見て、それが他の特定の整数で割り切れるかどうかを判断する独自のロジックをエンコードします。はいの場合、メソッドはAcceptable状態を返します。そうでない場合は、この整数を「拡張」して受け入れられるようにすることができるかどうかをどうにかして把握する必要があります。たとえば、数値の長さは 2 ~ 4 文字であるとします。これは、少なくとも 1、2、および 3 桁の整数のサブセットを拡張して許容できるようにすることができることを意味します。処理された整数がそのようなサブセットに属している場合、メソッドは を返しIntermediate、そうでない場合は を返しInvalidます。

最小値/最大値について:とメソッドは、入力のチェックに使用する範囲を定義しQSpinBoxます。サブクラスのメソッドの先頭で使用するという私の提案に従う場合は、これらの最小値と最大値をそれぞれの下部と上部のプロパティに設定する必要があります。setMinimumsetMaximumQSpinBox::validateQIntValidatorvalidateQSpinBoxQIntValidator

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
}
于 2016-11-04T06:40:31.037 に答える