2016-11-04 16 views
1

У меня есть QSpinBox, который принимает int s с определенными минимальными и максимальными значениями. Мне нужно установить фильтр на поле со спином, чтобы разрешить только числа, делящиеся на некоторые другие целочисленные числа. Кажется, это правильная задача для QIntValidator. Но я не понимаю:Как реализовать валидатор для окна вращения, чтобы проверить (n mod k == 0)?

  • когда вернуться Intermediate и когда Acceptable, учитывая, что число может иметь от 2 до 4 цифр, и, пока число не будет введено полностью пользователем, ни одно решение не может быть

  • как обращаться с минимальными и максимальными значениями: в настоящее время я устанавливаю их с помощью setMinimumValue() и setMaximumValue() соответственно; что делает установка валидатора в этом отношении?

Число может быть как отрицательным, так и положительным.

ответ

2

QSpinBox имеет собственную реализацию метода validate, унаследованного от его базового класса QAbstractSpinBox. Если вы хотите настроить поведение этого метода, например, используя QIntValidator, вам необходимо подклассу QSpinBox и переопределить метод validate соответственно в вашем подклассе.

Необходимые логики - «разрешить только числа, делящиеся на некоторое другое целое число» - выходит за пределы возможностей QIntValidator. Все, что он может сделать, это сказать, может ли данная строка быть преобразована в целое число в указанном диапазоне - или может ли данная строка быть расширена, чтобы превратиться в такое целое число (Intermediate).

Я думаю, вы могли бы использовать QIntValidator как препроцессор внутри QSpinBox подкласса реализации validate метода: вы звоните QIntValidator::validate первым, и если она возвращает Invalid состояния, так что делаете ваш метод. Но если она возвращает Intermediate или Acceptable, необходимо перейти по своему усмотрению:

  1. Возьмите входную строку и попытаться преобразовать его в целое число - вероятно QString::toInt должно хватить.
  2. Кодируйте свою собственную логику, которая смотрит на полученное целое число и определяет, делится ли оно на какое-то другое целое число. Если да, ваш метод возвращает состояние Acceptable. Если нет, вам нужно как-то выяснить, может ли это целое число быть «расширенным», чтобы стать приемлемым. Например, вы говорите, что число может составлять от 2 до 4 символов - это означает, что по крайней мере подмножество целых чисел 1, 2 и 3 цифры может быть расширено, чтобы стать приемлемым. Если обработанное целое относится к такому подмножеству, ваш метод должен вернуть Intermediate, в противном случае он должен вернуть Invalid.

О мин/макс значения: QSpinBox «ы setMinimum и setMaximum методы определяют диапазон, который QSpinBox::validate использует для проверки ввода. Если вы будете следовать моим предложением использовать QIntValidator в начале validate метода вашего QSpinBox подкласса, вы должны установить эти минимальные и максимальные значения в нижней части QIntValidator «s и топ свойства соответственно:

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 
} 

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

  • Нет связанных вопросов^_^