From a1175255150d27d50f9690d5f8685b31269d9fa1 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Mon, 9 Dec 2024 19:39:00 +0100 Subject: [PATCH] Widgets: ignore unhandled right mouse button presses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In many places this was already done; but there was some old code remaining where mousePressEvent() simply returned without ignoring the unhandled event. Task-number: QTBUG-93486 Task-number: QTBUG-132066 Pick-to: 6.9 Change-Id: I4a876980b7ef88ee478fa8cfd9f68b5be5b217a2 Reviewed-by: Tor Arne Vestbø --- src/widgets/widgets/qabstractspinbox.cpp | 1 + src/widgets/widgets/qlineedit.cpp | 4 +++- src/widgets/widgets/qscrollbar.cpp | 4 +++- .../widgets/widgets/qlineedit/tst_qlineedit.cpp | 15 +++++++++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/widgets/widgets/qabstractspinbox.cpp b/src/widgets/widgets/qabstractspinbox.cpp index 88b348a7c19..75b32784760 100644 --- a/src/widgets/widgets/qabstractspinbox.cpp +++ b/src/widgets/widgets/qabstractspinbox.cpp @@ -1364,6 +1364,7 @@ void QAbstractSpinBox::mousePressEvent(QMouseEvent *event) d->keyboardModifiers = event->modifiers(); if (event->button() != Qt::LeftButton || d->buttonState != None) { + event->ignore(); return; } diff --git a/src/widgets/widgets/qlineedit.cpp b/src/widgets/widgets/qlineedit.cpp index 958a52ad303..b08fa06ea16 100644 --- a/src/widgets/widgets/qlineedit.cpp +++ b/src/widgets/widgets/qlineedit.cpp @@ -1503,8 +1503,10 @@ void QLineEdit::mousePressEvent(QMouseEvent* e) if (d->sendMouseEventToInputContext(e)) return; - if (e->button() == Qt::RightButton) + if (e->button() == Qt::RightButton) { + e->ignore(); return; + } #ifdef QT_KEYPAD_NAVIGATION if (QApplication::QApplicationPrivate() && !hasEditFocus()) { setEditFocus(true); diff --git a/src/widgets/widgets/qscrollbar.cpp b/src/widgets/widgets/qscrollbar.cpp index 6d0783acf9c..2cb517cb66a 100644 --- a/src/widgets/widgets/qscrollbar.cpp +++ b/src/widgets/widgets/qscrollbar.cpp @@ -536,8 +536,10 @@ void QScrollBar::mousePressEvent(QMouseEvent *e) if (d->maximum == d->minimum // no range || (e->buttons() & (~e->button())) // another button was clicked before - || !(e->button() == Qt::LeftButton || (midButtonAbsPos && e->button() == Qt::MiddleButton))) + || !(e->button() == Qt::LeftButton || (midButtonAbsPos && e->button() == Qt::MiddleButton))) { + e->ignore(); return; + } d->pressedControl = style()->hitTestComplexControl(QStyle::CC_ScrollBar, &opt, e->position().toPoint(), this); d->pointerOutsidePressedControl = false; diff --git a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp index 364652978a2..7d546957164 100644 --- a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp +++ b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp @@ -247,6 +247,7 @@ private slots: void taskQTBUG_4679_selectToStartEndOfBlock(); #ifndef QT_NO_CONTEXTMENU void taskQTBUG_7902_contextMenuCrash(); + void contextMenu(); #endif void taskQTBUG_7395_readOnlyShortcut(); void QTBUG697_paletteCurrentColorGroup(); @@ -4025,6 +4026,20 @@ void tst_QLineEdit::taskQTBUG_7902_contextMenuCrash() QTest::qWait(300); // No crash, it's allright. } + +void tst_QLineEdit::contextMenu() // QTBUG-132066 +{ + QLineEdit le; + le.show(); + QVERIFY(QTest::qWaitForWindowExposed(&le)); + + // right-click: QLineEdit::mousePressEvent() should ignore the mouse press; + // QLineEdit::contextMenuEvent() should then be called to create and open a context menu + QTest::mouseClick(le.windowHandle(), Qt::RightButton, {}, le.rect().center()); + QTRY_VERIFY(le.findChild()); + + // This test could be extended to check and activate menu items. +} #endif void tst_QLineEdit::taskQTBUG_7395_readOnlyShortcut()