QSpinBox
имеет собственную реализацию метода validate
, унаследованного от его базового класса QAbstractSpinBox
. Если вы хотите настроить поведение этого метода, например, используя QIntValidator
, вам необходимо подклассу QSpinBox
и переопределить метод validate
соответственно в вашем подклассе.
Необходимые логики - «разрешить только числа, делящиеся на некоторое другое целое число» - выходит за пределы возможностей QIntValidator
. Все, что он может сделать, это сказать, может ли данная строка быть преобразована в целое число в указанном диапазоне - или может ли данная строка быть расширена, чтобы превратиться в такое целое число (Intermediate
).
Я думаю, вы могли бы использовать QIntValidator
как препроцессор внутри QSpinBox
подкласса реализации validate
метода: вы звоните QIntValidator::validate
первым, и если она возвращает Invalid
состояния, так что делаете ваш метод. Но если она возвращает Intermediate
или Acceptable
, необходимо перейти по своему усмотрению:
- Возьмите входную строку и попытаться преобразовать его в целое число - вероятно
QString::toInt
должно хватить.
- Кодируйте свою собственную логику, которая смотрит на полученное целое число и определяет, делится ли оно на какое-то другое целое число. Если да, ваш метод возвращает состояние
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
}