From 606cf37952b7ee31afa5487b0ccdf7f7efc14a6c Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Sun, 24 Aug 2025 09:59:09 -0400 Subject: [PATCH] Prevent mouse wheel scroll on entry edit username field (#12398) * Reported by shawnkhu via Matrix, thank you! --- src/gui/ApplicationSettingsWidget.cpp | 23 +---------------------- src/gui/GuiTools.h | 24 ++++++++++++++++++++++++ src/gui/entry/EditEntryWidget.cpp | 4 ++++ src/gui/entry/EditEntryWidgetMain.ui | 3 +++ 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/gui/ApplicationSettingsWidget.cpp b/src/gui/ApplicationSettingsWidget.cpp index 2fd0b6d7a..3d1a0e321 100644 --- a/src/gui/ApplicationSettingsWidget.cpp +++ b/src/gui/ApplicationSettingsWidget.cpp @@ -27,6 +27,7 @@ #include "autotype/AutoType.h" #include "core/Translator.h" +#include "gui/GuiTools.h" #include "gui/Icons.h" #include "gui/MainWindow.h" #include "gui/osutils/OSUtils.h" @@ -62,28 +63,6 @@ private: QWidget* widget; }; -/** - * Helper class to ignore mouse wheel events on non-focused widgets - * NOTE: The widget must NOT have a focus policy of "WHEEL" - */ -class MouseWheelEventFilter : public QObject -{ -public: - explicit MouseWheelEventFilter(QObject* parent) - : QObject(parent){}; - -protected: - bool eventFilter(QObject* obj, QEvent* event) override - { - const auto* widget = qobject_cast(obj); - if (event->type() == QEvent::Wheel && widget && !widget->hasFocus()) { - event->ignore(); - return true; - } - return QObject::eventFilter(obj, event); - } -}; - ApplicationSettingsWidget::ApplicationSettingsWidget(QWidget* parent) : EditWidget(parent) , m_secWidget(new QWidget()) diff --git a/src/gui/GuiTools.h b/src/gui/GuiTools.h index c5e710896..1294967eb 100644 --- a/src/gui/GuiTools.h +++ b/src/gui/GuiTools.h @@ -18,6 +18,7 @@ #ifndef KEEPASSXC_GUITOOLS_H #define KEEPASSXC_GUITOOLS_H +#include #include #include @@ -29,4 +30,27 @@ namespace GuiTools bool confirmDeletePluginData(QWidget* parent, const QList& entries); size_t deleteEntriesResolveReferences(QWidget* parent, const QList& entries, bool permanent); } // namespace GuiTools + +/** + * Helper class to ignore mouse wheel events on non-focused widgets + * NOTE: The widget must NOT have a focus policy of "WHEEL" + */ +class MouseWheelEventFilter : public QObject +{ +public: + explicit MouseWheelEventFilter(QObject* parent) + : QObject(parent){}; + +protected: + bool eventFilter(QObject* obj, QEvent* event) override + { + const auto* widget = qobject_cast(obj); + if (event->type() == QEvent::Wheel && widget && !widget->hasFocus()) { + event->ignore(); + return true; + } + return QObject::eventFilter(obj, event); + } +}; + #endif // KEEPASSXC_GUITOOLS_H diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index d2213a669..65e5dd0cc 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -53,6 +53,7 @@ #include "gui/EditWidgetProperties.h" #include "gui/FileDialog.h" #include "gui/Font.h" +#include "gui/GuiTools.h" #include "gui/Icons.h" #include "gui/MessageBox.h" #include "gui/entry/AutoTypeAssociationsModel.h" @@ -185,7 +186,10 @@ void EditEntryWidget::setupMain() m_mainUi->setupUi(m_mainWidget); addPage(tr("Entry"), icons()->icon("document-edit"), m_mainWidget); + // Disable mouse wheel grab when scrolling + m_mainUi->usernameComboBox->installEventFilter(new MouseWheelEventFilter(this)); m_mainUi->usernameComboBox->setEditable(true); + m_mainUi->usernameComboBox->lineEdit()->setFocusPolicy(Qt::StrongFocus); m_usernameCompleter->setCompletionMode(QCompleter::InlineCompletion); m_usernameCompleter->setCaseSensitivity(Qt::CaseSensitive); m_usernameCompleter->setModel(m_usernameCompleterModel); diff --git a/src/gui/entry/EditEntryWidgetMain.ui b/src/gui/entry/EditEntryWidgetMain.ui index 6816b090f..d5b002ec2 100644 --- a/src/gui/entry/EditEntryWidgetMain.ui +++ b/src/gui/entry/EditEntryWidgetMain.ui @@ -140,6 +140,9 @@ + + Qt::StrongFocus + Username field