#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?