Несколько диапазонов для QDoubleSpinBoxes в QT - PullRequest
1 голос
/ 13 апреля 2019

Я создаю приложение, которое использует несколько частотных диапазонов. Мне нужно, чтобы пользователь мог увеличивать / уменьшать значения в QDoubleSpinBox, а также вводить значение. Если я увеличу значение до числа из одного диапазона, я бы хотел, чтобы значение переместилось в следующий диапазон (тот же принцип для уменьшения значения).

Обеспечивает ли QDoubleSpinBox такое поведение? Я не могу найти ответ на то, что я ищу. Я попытался установить диапазон, используя QDoubleValidator, но я не думаю, что он поддерживает несколько диапазонов (если я что-то упустил). Я также пытался использовать проверки диапазона с операторами if с сигналом valueChanged(), который получен, но должен быть более простой способ, верно?

Вот пример того, как я хотел бы, чтобы doubleSpinBox вел себя:

Начальное значение : 9,75

Диапазон 1 : 9,75 - 9,95

Диапазон 2 : 10,15 - 10,40

Диапазон 3 : 17,2 - 20,4

Если значение превышает 9,95, перейти к 10,15.

Если значение превышает 10,40, перейти к 17,2 и т. Д.

Я также хотел бы иметь такое же поведение при уменьшении значения (возврат к Диапазон 1 , если значение падает ниже 10,15).

Я бы хотел сделать это без написания нескольких операторов if/else if, если смогу избежать этого.

1 Ответ

1 голос
/ 13 апреля 2019

Попытка создать несколько диапазонов не является хорошим решением. Вы должны рассмотреть свою проблему по-другому: у вас есть один диапазон от 9,75 до 20,40 с запрещенными значениями.

Таким образом, если вы переопределите метод, такой как QDoubleSpinBox::stepsBy() и QDoubleSpinBox::valueFromText(), вы сможете сбросить значения за пределами ваших диапазонов:

class Spinbox: public QDoubleSpinBox
{
public:
    Spinbox(): QDoubleSpinBox()
    {
        setRange(9.75, 20.4);
        setSingleStep(0.1);
    }

    virtual void stepBy(int steps) override
    {
        double const newValue = checkValue(value() + (steps * singleStep()));
        setValue(newValue);
    }

    virtual double valueFromText(QString const& text) const override
    {
        qDebug() << text;
        double const newValue = QDoubleSpinBox::valueFromText(text);
        return checkValue(newValue);
    }

    double checkValue(double newValue) const
    {
        qDebug() << newValue << value();
        if (9.95 < newValue && newValue < 10.15)
        {
                if (newValue > value())
                    return 10.15;
                else
                    return 9.95;
        }
        else if (10.4 < newValue && newValue < 17.2)
        {
            if (newValue > value())
                return 17.2;
            else
                return 10.4;
        }
        return newValue;
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...