Qt QSpinBox с набором предопределенных значений

#qt #qspinbox

#qt #qspinbox

Вопрос:

У меня есть QSpinBox , который должен принимать только набор дискретных значений (скажем, 2, 5, 10). Я могу setMinimum(2) и setMaximum(10) , но я не могу setSingleStep , потому что у меня есть шаг 3 и один из 5.

Есть ли другой виджет, который я могу использовать, но который имеет тот же пользовательский QSpinBox интерфейс, что и?

Если нет, что я должен перезаписать для достижения желаемого эффекта?

Комментарии:

1. Ваш вопрос означает, что spinbox имеет от 2 до 10, но если вы его используете, он показывает 2,5,10 на каждом шаге? Есть ли какие-то правила для вычитания? 3,5 и далее?

2. Справедливый вопрос, прошу прощения, если это было непонятно. Я хочу, чтобы в окне вращения разрешался выбор только 2, 5 и 10. Ничего промежуточного. Если значение равно 5, и я нажимаю вверх, я хочу перейти к 10. Если значение равно 5, и я хочу пойти вниз, значение должно быть равно 2. Вставка 3 вручную должна увеличиваться или уменьшаться до ближайшего доступного значения.

3. Хорошо, я понимаю, извините.

4. Почему бы просто не использовать вместо этого QComboBox ? Это позволит вам просто использовать [2, 5, 10] в качестве значений. В противном случае вам придется создать свой собственный QWidget, чтобы имитировать то, что вы хотите.

5. Он должен выглядеть и вести себя так же, как a QSpinBox , к сожалению, не может иметь выпадающего списка.

Ответ №1:

Используется QSpinBox::stepsBy() для обработки значений.

Например:

 class Spinbox: public QSpinBox
{
public:
    Spinbox(): QSpinBox()
    {
        acceptedValues << 0 << 3 << 5 << 10; // We want only 0, 3, 5, and 10
        setRange(acceptedValues.first(), acceptedValues.last());

    }
    virtual void stepBy(int steps) override
    {
        int const index = std::max(0, (acceptedValues.indexOf(value())   steps) % acceptedValues.length()); // Bounds the index between 0 and length
        setValue(acceptedValues.value(index));
    }
private:
    QList<int> acceptedValues;
};
 

Комментарии:

1. Это сработало отлично. Простой и понятный. Спасибо!

2. Как это интегрируется в проект и создается в QML?