Функция проверки QAbstractSpinBox - PullRequest
0 голосов
/ 20 марта 2019

Я читаю эту функцию в QT Docu

В ней говорится

QValidator::State QAbstractSpinBox::validate(QString &input, int &pos) const [virtual]

Эта виртуальная функция вызываетсяQAbstractSpinBox для определения допустимости input . Параметр pos указывает позицию в строке .Повторно реализовано в различных подклассах.

У меня странный вопрос, потому что я не совсем понимаю документ. input - это строка, мы определяем, является ли input действительным или нет.Итак, зачем нам позиция в строке, для чего?Я думал, что pos - это длина строки, но когда я отлаживал, это не так.Так что же означает pos здесь?

ОБНОВЛЕНИЕ:

Благодаря @mohabouje.В моем случае я использую класс, унаследованный от QAbstractSpinBox, я переопределяю этот метод и хочу проверить строку после ее изменения.Как я могу обновить это pos для проверки?

QValidator::State MySpinBox::validate( QString &input, int &pos ) const
{
    QString pureValue = stripped( input, &tmpPos, prefix(), suffix() );  //this is my function, i just want to remove also prefix and suffix 
    //I want to add group separator into the pureValue and validate it after that
    //I want to add group separator here, not in the constructor with setGroupSeparatorShown(true);
    //When i add group separator here, the separator appears simultaneously when we type
    //When i set setGroupSeparatorShown(true) in the constructor, it appears after we finish editing and move to another thing (this element loses focus) 
    pureValue.insert(3, locale().groupSeparator());
    input = pureValue;

     // I think now 'pos' has changed, how could I update 'pos' to call the following function?
     QValidator::State state = QDoubleSpinBox::validate( input, pos );
     return state;
}

1 Ответ

1 голос
/ 20 марта 2019

Мне было любопытно о базовой реализации. Я проверил исходный код в github .

QVariant QDoubleSpinBoxPrivate::validateAndInterpret(QString &input, int &pos,
                                                     QValidator::State &state) const
{
    if (cachedText == input && !input.isEmpty()) {
        state = cachedState;
        QSBDEBUG() << "cachedText was '" << cachedText << "' state was "
                   << state << " and value was " << cachedValue;
        return cachedValue;
    }
    const double max = maximum.toDouble();
    const double min = minimum.toDouble();

    QString copy = stripped(input, &pos);
    QSBDEBUG() << "input" << input << "copy" << copy;
    int len = copy.size();
    ...
}

Параметры используются в закрытой функции, которая называется stripped. Это исходный код:

QString QAbstractSpinBoxPrivate::stripped(const QString &t, int *pos) const
{
    QString text = t;
    if (specialValueText.size() == 0 || text != specialValueText) {
        int from = 0;
        int size = text.size();
        bool changed = false;
        if (prefix.size() && text.startsWith(prefix)) {
            from += prefix.size();
            size -= from;
            changed = true;
        }
        if (suffix.size() && text.endsWith(suffix)) {
            size -= suffix.size();
            changed = true;
        }
        if (changed)
            text = text.mid(from, size);
    }

    const int s = text.size();
    text = text.trimmed();
    if (pos)
        (*pos) -= (s - text.size());
    return text;

}

Итак, если я правильно понял, учитывая конфигурацию строки и префикса / суффикса, функция берет строку и вычисляет реальный размер проверяемых данных, игнорируя префикс и суффикс.

Функция возвращает уже проверенные данные, которые могут быть проанализированы для вычисления числового значения.

Исходное значение pos, функция вычитает разницу размера проверяемого текста и размера текста после выполнения операции обрезки.

...