Add an option to scroll the QComboBox on macOS with the mouse wheel

Since there may be some applications that want to make their comboboxes
scrollable or not with the mouse wheel then a style hint is added to
make this toggable. It defaults to true for all platforms except macOS
to keep it in line with existing behavior.

[ChangeLog][QtWidgets][QStyle] Added SH_ComboBox_AllowWheelScrolling as
a style hint to enable/disable the use of the mouse wheel in a QComboBox.
This defaults to true in all styles except the macOS one so there is no
change in existing behavior.

Task-number: QTBUG-53094
Change-Id: I6eb61e1990bfc79e3b3ea82d7b91ee39096fa077
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@qt.io>
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
bb10
Andy Shaw 2017-09-25 13:03:25 +02:00
parent bef0db36ac
commit 5e9e4ccdc3
6 changed files with 22 additions and 11 deletions

View File

@ -2963,6 +2963,9 @@ int QMacStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget *w
// min/max/close buttons on windows don't show tool tips
ret = false;
break;
case SH_ComboBox_AllowWheelScrolling:
ret = false;
break;
default:
ret = QCommonStyle::styleHint(sh, opt, w, hret);
break;

View File

@ -5290,6 +5290,9 @@ int QCommonStyle::styleHint(StyleHint sh, const QStyleOption *opt, const QWidget
case SH_Widget_Animation_Duration:
ret = styleHint(SH_Widget_Animate, opt, widget, hret) ? 200 : 0;
break;
case SH_ComboBox_AllowWheelScrolling:
ret = true;
break;
default:
ret = 0;
break;

View File

@ -1994,6 +1994,11 @@ void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
A value equal to zero means that the animations will be disabled.
This enum value has been introduced in Qt 5.10.
\value SH_ComboBox_AllowWheelScrolling
Determines if the mouse wheel can be used to scroll inside a QComboBox.
This is on by default in all styles except the Mac style.
This enum value has been introduced in Qt 5.10.
\sa styleHint()
*/

View File

@ -739,6 +739,7 @@ public:
SH_ItemView_ScrollMode,
SH_TitleBar_ShowToolTipsOnButtons,
SH_Widget_Animation_Duration,
SH_ComboBox_AllowWheelScrolling,
// Add new style hint values here
SH_CustomBase = 0xf0000000

View File

@ -3350,11 +3350,11 @@ void QComboBox::keyReleaseEvent(QKeyEvent *e)
#if QT_CONFIG(wheelevent)
void QComboBox::wheelEvent(QWheelEvent *e)
{
#ifdef Q_OS_DARWIN
Q_UNUSED(e);
#else
Q_D(QComboBox);
if (!d->viewContainer()->isVisible()) {
QStyleOptionComboBox opt;
initStyleOption(&opt);
if (style()->styleHint(QStyle::SH_ComboBox_AllowWheelScrolling, &opt, this) &&
!d->viewContainer()->isVisible()) {
const int rowCount = count();
int newIndex = currentIndex();
@ -3374,7 +3374,6 @@ void QComboBox::wheelEvent(QWheelEvent *e)
}
e->accept();
}
#endif
}
#endif

View File

@ -2052,13 +2052,13 @@ void tst_QComboBox::mouseWheel_data()
QTest::newRow("upper locked") << disabled << start << wheel << expected;
wheel = -1;
#ifdef Q_OS_DARWIN
const bool allowsWheelScroll = QApplication::style()->styleHint(QStyle::SH_ComboBox_AllowWheelScrolling);
// on OS X & iOS mouse wheel shall have no effect on combo box
expected = start;
#else
// on other OSes we should jump to next enabled item (no. 5)
expected = 5;
#endif
if (!allowsWheelScroll)
expected = start;
else // on other OSes we should jump to next enabled item (no. 5)
expected = 5;
QTest::newRow("jump over") << disabled << start << wheel << expected;
disabled.clear();