diff options
Diffstat (limited to 'src/widgets/widgets/qabstractspinbox.cpp')
-rw-r--r-- | src/widgets/widgets/qabstractspinbox.cpp | 68 |
1 files changed, 61 insertions, 7 deletions
diff --git a/src/widgets/widgets/qabstractspinbox.cpp b/src/widgets/widgets/qabstractspinbox.cpp index f059980c5c..1eafb73ba8 100644 --- a/src/widgets/widgets/qabstractspinbox.cpp +++ b/src/widgets/widgets/qabstractspinbox.cpp @@ -100,6 +100,16 @@ QT_BEGIN_NAMESPACE integer value to signify how many steps were taken. E.g. Pressing Qt::Key_Down will trigger a call to stepBy(-1). + When the user triggers a step whilst holding the Qt::ControlModifier, + QAbstractSpinBox steps by 10 instead of making a single step. This + step modifier affects wheel events, key events and interaction with + the spinbox buttons. Note that on macOS, Control corresponds to the + Command key. + + Since Qt 5.12, QStyle::SH_SpinBox_StepModifier can be used to select + which Qt::KeyboardModifier increases the step rate. Qt::NoModifier + disables this feature. + QAbstractSpinBox also provide a virtual function stepEnabled() to determine whether stepping up/down is allowed at any point. This function returns a bitset of StepEnabled. @@ -117,6 +127,13 @@ QT_BEGIN_NAMESPACE */ /*! + \enum QAbstractSpinBox::StepType + + \value DefaultStepType + \value AdaptiveDecimalStepType +*/ + +/*! \fn void QAbstractSpinBox::editingFinished() This signal is emitted editing is finished. This happens when the @@ -640,7 +657,15 @@ void QAbstractSpinBox::stepBy(int steps) e = AlwaysEmit; } if (!dontstep) { - d->setValue(d->bound(d->value + (d->singleStep * steps), old, steps), e); + QVariant singleStep; + switch (d->stepType) { + case QAbstractSpinBox::StepType::AdaptiveDecimalStepType: + singleStep = d->calculateAdaptiveDecimalStep(steps); + break; + default: + singleStep = d->singleStep; + } + d->setValue(d->bound(d->value + (singleStep * steps), old, steps), e); } else if (e == AlwaysEmit) { d->emitSignals(e, old); } @@ -826,9 +851,13 @@ void QAbstractSpinBox::changeEvent(QEvent *event) style()->styleHint(QStyle::SH_SpinBox_ClickAutoRepeatThreshold, 0, this); if (d->edit) d->edit->setFrame(!style()->styleHint(QStyle::SH_SpinBox_ButtonsInsideFrame, nullptr, this)); + d->stepModifier = static_cast<Qt::KeyboardModifier>(style()->styleHint(QStyle::SH_SpinBox_StepModifier, nullptr, this)); d->reset(); d->updateEditFieldGeometry(); break; + case QEvent::LocaleChange: + d->updateEdit(); + break; case QEvent::EnabledChange: if (!isEnabled()) { d->reset(); @@ -1008,6 +1037,8 @@ void QAbstractSpinBox::keyPressEvent(QKeyEvent *event) const bool up = (event->key() == Qt::Key_PageUp || event->key() == Qt::Key_Up); if (!(stepEnabled() & (up ? StepUpEnabled : StepDownEnabled))) return; + if (!isPgUpOrDown && (event->modifiers() & d->stepModifier)) + steps *= 10; if (!up) steps *= -1; if (style()->styleHint(QStyle::SH_SpinBox_AnimateButton, 0, this)) { @@ -1134,11 +1165,24 @@ void QAbstractSpinBox::keyReleaseEvent(QKeyEvent *event) void QAbstractSpinBox::wheelEvent(QWheelEvent *event) { Q_D(QAbstractSpinBox); +#ifdef Q_OS_MACOS + // If the event comes from a real mouse wheel, rather than a track pad + // (Qt::MouseEventSynthesizedBySystem), the shift modifier changes the + // scroll orientation to horizontal. + // Convert horizontal events back to vertical whilst shift is held. + if ((event->modifiers() & Qt::ShiftModifier) + && event->source() == Qt::MouseEventNotSynthesized) { + d->wheelDeltaRemainder += event->angleDelta().x(); + } else { + d->wheelDeltaRemainder += event->angleDelta().y(); + } +#else d->wheelDeltaRemainder += event->angleDelta().y(); +#endif const int steps = d->wheelDeltaRemainder / 120; d->wheelDeltaRemainder -= steps * 120; if (stepEnabled() & (steps > 0 ? StepUpEnabled : StepDownEnabled)) - stepBy(event->modifiers() & Qt::ControlModifier ? steps * 10 : steps); + stepBy(event->modifiers() & d->stepModifier ? steps * 10 : steps); event->accept(); } #endif @@ -1238,18 +1282,19 @@ void QAbstractSpinBox::timerEvent(QTimerEvent *event) } if (doStep) { + const bool increaseStepRate = QGuiApplication::keyboardModifiers() & d->stepModifier; const StepEnabled st = stepEnabled(); if (d->buttonState & Up) { if (!(st & StepUpEnabled)) { d->reset(); } else { - stepBy(1); + stepBy(increaseStepRate ? 10 : 1); } } else if (d->buttonState & Down) { if (!(st & StepDownEnabled)) { d->reset(); } else { - stepBy(-1); + stepBy(increaseStepRate ? -10 : -1); } } return; @@ -1377,8 +1422,9 @@ QAbstractSpinBoxPrivate::QAbstractSpinBoxPrivate() cachedState(QValidator::Invalid), pendingEmit(false), readOnly(false), wrapping(false), ignoreCursorPositionChanged(false), frame(true), accelerate(false), keyboardTracking(true), cleared(false), ignoreUpdateEdit(false), correctionMode(QAbstractSpinBox::CorrectToPreviousValue), - acceleration(0), hoverControl(QStyle::SC_None), buttonSymbols(QAbstractSpinBox::UpDownArrows), validator(0), - showGroupSeparator(0), wheelDeltaRemainder(0) + stepModifier(Qt::ControlModifier), acceleration(0), hoverControl(QStyle::SC_None), + buttonSymbols(QAbstractSpinBox::UpDownArrows), validator(0), showGroupSeparator(0), + wheelDeltaRemainder(0) { } @@ -1629,7 +1675,10 @@ void QAbstractSpinBoxPrivate::updateState(bool up, bool fromKeyboard /* = false : QAbstractSpinBox::StepDownEnabled))) { spinClickThresholdTimerId = q->startTimer(spinClickThresholdTimerInterval); buttonState = (up ? Up : Down) | (fromKeyboard ? Keyboard : Mouse); - q->stepBy(up ? 1 : -1); + int steps = up ? 1 : -1; + if (QGuiApplication::keyboardModifiers() & stepModifier) + steps *= 10; + q->stepBy(steps); #ifndef QT_NO_ACCESSIBILITY QAccessibleValueChangeEvent event(q, value); QAccessible::updateAccessibility(&event); @@ -1898,6 +1947,11 @@ void QAbstractSpinBoxPrivate::clearCache() const cachedState = QValidator::Acceptable; } +QVariant QAbstractSpinBoxPrivate::calculateAdaptiveDecimalStep(int steps) const +{ + Q_UNUSED(steps) + return singleStep; +} // --- QSpinBoxValidator --- |