2012-04-11 1 views
1

Извините за смутное название.Подкласс Q (Double) SpinBox: reimplement valueFormText() и validate()

В настоящее время, если значение вводится в Q (Double) SpinBox, который выходит за пределы его диапазона (например, ввод «100», когда max равен 90), значение отклоняется и вместо этого последнее действительное значение помещается обратно SpinBox.

Я хочу изменить это поведение, чтобы можно было вводить значения вне диапазона, которые будут автоматически исправлены (минимальны или максимальны), поскольку в противном случае было бы глупо усложнять пользователю диапазон значений. Изучив документы и исходный код QT, я решил подклассифицировать QSpinBox (будет иметь дело с двойным вариантом позже) в «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, но я просто хочу, основная концепция работает в настоящее время. Я попытался изменить validate(), чтобы всегда возвращать приемлемый, но, как ни странно, полученные спинбоксы по-прежнему будут вести себя по-старому.

Либо исправление моих собственных методов, либо другой подход к этой проблеме приветствуются! Спасибо за ваше время.

+1

'goto bad_text;' .... \ * shiver \ * –

+0

Кроме того .. Если это всего лишь гадание диапазона значений: В некоторых наших приложениях мы предлагаем наконечник инструмента, например диапазон значений и действительный масштаб (например, если вы можете вводить только значения, делящиеся на 0,1). Конечно, это не подходит для каждого приложения. –

+0

@Tim Meyer Cmon, по крайней мере, я придерживаюсь только переходов вперед = P и подсказка инструмента, конечно, возможность, но я просто нахожу это странно контр-интуитивным, если я вводим значение вне диапазона, а отображаемое значение просто возвращается к старому. – Ancurio

ответ

3

Подписи методов, которые вы пытаетесь переописать является:

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

Оба ваших методы отсутствуют Конст, поэтому они имеют разные методы и, таким образом, никогда не вызываются из базового класса.

+0

Ха-ха, по иронии судьбы, я узнал об этом за 1 минуту до вашего поста; D – Ancurio

0

На другой ноте,

QAbstractSpinButton::setCorrectionMode(QAbstractSpinBox::CorrectToNearestValue) 

может достичь somehwat аналогичных результатов (набрав значения меньше, чем минимальное будет исправлено в мин), хотя вы все еще предотвращены от ввода значения больше, чем максимум из-за проверки подлинности. (И для этого этого недостаточно для моих нужд, просто оставив его здесь для справки.)

Смежные вопросы