Swallow wheel events while a popup widget is open.

Wheel events should not cause a popup widget parented on a scrollable
widget to be closed or moved to correctly reflect the system behavior
on OS X and Windows.

Task-number: QTBUG-42731
Task-number: QTBUG-40656
Change-Id: I4ef75aa8331390309c251316ac76db2cf9ec51f7
Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
This commit is contained in:
Friedemann Kleint 2014-12-11 09:47:43 +01:00
parent be5cfa960b
commit ea9a366d3f
2 changed files with 10 additions and 9 deletions

View File

@ -3320,12 +3320,10 @@ bool QApplication::notify(QObject *receiver, QEvent *e)
QWidget* w = static_cast<QWidget *>(receiver);
QWheelEvent* wheel = static_cast<QWheelEvent*>(e);
// QTBUG-40656, combo and other popups should close when the main window gets a wheel event.
while (QWidget *popup = QApplication::activePopupWidget()) {
// QTBUG-40656, QTBUG-42731: ignore wheel events when a popup (QComboBox) is open.
if (const QWidget *popup = QApplication::activePopupWidget()) {
if (w->window() != popup)
popup->close();
else
break;
return true;
}
QPoint relpos = wheel->pos();

View File

@ -124,7 +124,7 @@ private slots:
void pixmapIcon();
void mouseWheel_data();
void mouseWheel();
void wheelClosingPopup();
void popupWheelHandling();
void layoutDirection();
void itemListPosition();
void separatorItem_data();
@ -2037,9 +2037,9 @@ void tst_QComboBox::mouseWheel()
}
}
void tst_QComboBox::wheelClosingPopup()
void tst_QComboBox::popupWheelHandling()
{
// QTBUG-40656, combo and other popups should close when the main window gets a wheel event.
// QTBUG-40656, QTBUG-42731 combo and other popups should not be affected by wheel events.
QScrollArea scrollArea;
scrollArea.move(300, 300);
QWidget *widget = new QWidget;
@ -2058,9 +2058,12 @@ void tst_QComboBox::wheelClosingPopup()
QVERIFY(QTest::qWaitForWindowExposed(&scrollArea));
comboBox->showPopup();
QTRY_VERIFY(comboBox->view() && comboBox->view()->isVisible());
const QPoint popupPos = comboBox->view()->pos();
QWheelEvent event(QPointF(10, 10), WHEEL_DELTA, Qt::NoButton, Qt::NoModifier);
QVERIFY(QCoreApplication::sendEvent(scrollArea.windowHandle(), &event));
QTRY_VERIFY(!comboBox->view()->isVisible());
QCoreApplication::processEvents();
QVERIFY(comboBox->view()->isVisible());
QCOMPARE(comboBox->view()->pos(), popupPos);
}
void tst_QComboBox::layoutDirection()