1

タイトルがあいまいでごめんなさい。

現在、値がその範囲外のQ(Double)SpinBoxに入力された場合(たとえば、最大が90の場合に「100」と入力した場合)、値は拒否され、代わりに最後の有効な値がSpinBoxに戻されます。

この動作を変更して、(最小または最大のいずれかに)自動的に修正される範囲外の値を入力できるようにします。そうしないと、ユーザーが値の範囲を推測するのがばかげて難しいためです。QTのドキュメントとソースコードを調べた後、QSpinBox(後でDoubleバリアントを処理します)を「QSpinBoxFS」にサブクラス化し、タイトルに記載されている両方のメソッドを再実装することにしました。どういうわけか、これはまったく効果がなく、動作は同じです。

これらは私の方法です:

QValidator::State QSpinBoxFS::validate(QString &input,
                                       int &pos)
{
    QIntValidator *validator = new QIntValidator();
    return validator->validate(input, pos);
}

int QSpinBoxFS::valueFromText(const QString &text)
{
    const int max = maximum();
    const int min = minimum();

    QString copy = text;
    int dummy = 0;

    QValidator::State state = validate(copy, dummy);

    if (state == QValidator::Acceptable)
    {
        bool ok;
        int num = locale().toInt(text, &ok, 10);
        if (!ok) { goto bad_text; }

        if (num < min) { return min; }
        if (num > max) { return max; }

        return num;
    }
    else
    {
        bad_text:
        return (max > 0) ? min : max;
    }
}

もちろん、これはQSpinBoxPrivate :: validateAndInterpretで行われるペダンティックチェックには実際には適切ではありませんが、今のところ基本的な概念が機能することを望んでいます。常にAcceptableを返すようにvalidate()を変更しようとしましたが、奇妙なことに、結果のスピンボックスは古い方法で動作します。

私自身の方法の修正またはこの問題への別のアプローチのいずれかを歓迎します!お時間をいただきありがとうございます。

4

2 に答える 2

3

再実装しようとしているメソッドのシグネチャは次のとおりです。

QValidator::State validate(QString & input,int & pos) const # <- const!
int valueFromText(const QString & text) const # <- const!

どちらのメソッドにもconstがないため、これらは異なるメソッドであり、基本クラスから呼び出されることはありません。

于 2012-04-11T14:23:11.947 に答える
0

別の注意点として、

QAbstractSpinButton::setCorrectionMode(QAbstractSpinBox::CorrectToNearestValue)

バリデーターのためにmaxより大きい値を入力することはできませんが、同様の結果を得ることができます(minより小さい値の入力はminに修正されます)。(したがって、それは私のニーズには不十分であり、参照用にここに残しておくだけです。)

于 2012-04-12T14:26:58.910 に答える