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

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

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

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


person Andrei Cioara    schedule 13.04.2019    source источник
comment
Ваш вопрос означает, что счетчик имеет от 2 до 10, но если вы его используете, он показывает 2, 5, 10 на каждом шаге? Есть ли какие-то правила для вычитания? 3,5, а дальше?   -  person Haru    schedule 13.04.2019
comment
Справедливый вопрос, извините, если что не так. Я хочу, чтобы счетчик позволял выбирать только 2, 5 и 10. Ничего между ними. Если значение равно 5 и я нажимаю вверх, я хочу перейти к 10. Если значение равно 5 и я хочу перейти вниз, значение должно перейти к 2. Вставка 3 вручную должна увеличить или уменьшить значение до ближайшего доступного значения.   -  person Andrei Cioara    schedule 13.04.2019
comment
Хорошо, я понял, извини.   -  person Haru    schedule 13.04.2019
comment
Почему бы вместо этого просто не использовать QComboBox? Это позволит вам просто иметь [2, 5, 10] в качестве значений. В противном случае вам придется создать свой собственный QWidget, чтобы имитировать то, что вы хотите.   -  person aseylys    schedule 13.04.2019
comment
Он должен выглядеть и вести себя так же, как QSpinBox, к сожалению, не может иметь выпадающего списка.   -  person Andrei Cioara    schedule 13.04.2019


Ответы (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;
};
person Dimitry Ernot    schedule 13.04.2019
comment
Это сработало отлично. Просто и понятно. Благодарю вас! - person Andrei Cioara; 13.04.2019