From 875dac1706e51751010b50dff96c8d7b8184d349 Mon Sep 17 00:00:00 2001 From: zhangjiarui Date: Thu, 24 Sep 2026 16:19:55 +0800 Subject: [PATCH] fix(reader): restore arrow key scrolling by removing QAction shortcut registration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Arrow keys (Left/Right/Up/Down) and Space were registered as QAction shortcuts in Central.cpp constructor, which intercepted key events and prevented Qt's default scrolling behavior in document reading mode. The page navigation logic in CentralDocPage.cpp for these keys was already commented out, so the QAction had no effect except blocking default scrolling. Fix by commenting out the QAction registrations for these keys in Central.cpp, removing the slide widget key forwarding in CentralDocPage.cpp, and adding a keyPressEvent override to SlideWidget with setFocus() in its constructor so slide show mode handles arrow keys and space independently. This restores the fix from commit a81e5e19 that was reverted by the v23 merge commit b20fcf92. Log: 方向键无法滚动文档页面 Bug: https://pms.uniontech.com/bug-view-374547.html --- reader/uiframe/Central.cpp | 15 +++++++-------- reader/uiframe/CentralDocPage.cpp | 1 - reader/widgets/SlideWidget.cpp | 10 ++++++++++ reader/widgets/SlideWidget.h | 16 +++++++++------- tests/uiframe/ut_centraldocpage.cpp | 5 ++--- tests/widgets/ut_slidewidget.cpp | 11 +++++++---- 6 files changed, 35 insertions(+), 23 deletions(-) diff --git a/reader/uiframe/Central.cpp b/reader/uiframe/Central.cpp index fd528236a..946f13777 100644 --- a/reader/uiframe/Central.cpp +++ b/reader/uiframe/Central.cpp @@ -45,14 +45,13 @@ Central::Central(QWidget *parent) keyList.append(QKeySequence::Print); keyList.append(QKeySequence::Save); keyList.append(QKeySequence::Copy); - // 屏蔽右侧区域的切页快捷键,使用默认的滚动效果 - // when using slide mode, left & right keys are needed. modify by lz,at 2022.4.18 - keyList.append(QKeySequence(Qt::Key_Left)); - keyList.append(QKeySequence(Qt::Key_Right)); - - keyList.append(QKeySequence(Qt::Key_Up)); - keyList.append(QKeySequence(Qt::Key_Down)); - keyList.append(QKeySequence(Qt::Key_Space)); + //使用下面5个快捷键会屏蔽主界面对应的功能,故注释 + //keyList.append(QKeySequence(Qt::Key_Left)); + //keyList.append(QKeySequence(Qt::Key_Right)); + + //keyList.append(QKeySequence(Qt::Key_Up)); + //keyList.append(QKeySequence(Qt::Key_Down)); + //keyList.append(QKeySequence(Qt::Key_Space)); keyList.append(QKeySequence(Qt::Key_Escape)); keyList.append(QKeySequence(Qt::Key_F5)); keyList.append(QKeySequence(Qt::Key_F11)); diff --git a/reader/uiframe/CentralDocPage.cpp b/reader/uiframe/CentralDocPage.cpp index a8fea647e..d5631c00c 100644 --- a/reader/uiframe/CentralDocPage.cpp +++ b/reader/uiframe/CentralDocPage.cpp @@ -611,7 +611,6 @@ void CentralDocPage::handleShortcut(const QString &s) } if (m_slideWidget) { - m_slideWidget->handleKeyPressEvent(s); return; } diff --git a/reader/widgets/SlideWidget.cpp b/reader/widgets/SlideWidget.cpp index 4f67c686f..265ce9dcd 100644 --- a/reader/widgets/SlideWidget.cpp +++ b/reader/widgets/SlideWidget.cpp @@ -9,6 +9,7 @@ #include "SlidePlayWidget.h" #include "Application.h" #include "ReaderImageThreadPoolManager.h" +#include "Utils.h" #include #include @@ -26,6 +27,7 @@ SlideWidget::SlideWidget(DocSheet *docsheet) initControl(); initImageControl(); show(); + QTimer::singleShot(0, this, [this](){this->setFocus();}); } SlideWidget::~SlideWidget() @@ -345,6 +347,14 @@ void SlideWidget::handleKeyPressEvent(const QString &sKey) } } +void SlideWidget::keyPressEvent(QKeyEvent *event) +{ + QString key = Utils::getKeyshortcut(event); + handleKeyPressEvent(key); + + DWidget::keyPressEvent(event); +} + void SlideWidget::onFetchImage(int index) { const QPixmap &pix = ReaderImageThreadPoolManager::getInstance()->getImageForDocSheet(m_docSheet, index); diff --git a/reader/widgets/SlideWidget.h b/reader/widgets/SlideWidget.h index b3fc73ce8..cc283ff3e 100644 --- a/reader/widgets/SlideWidget.h +++ b/reader/widgets/SlideWidget.h @@ -36,13 +36,6 @@ public slots: */ void setWidgetState(bool full); - /** - * @brief handleKeyPressEvent - * 按键处理事件 - * @param sKey - */ - void handleKeyPressEvent(const QString &sKey); - /** * @brief onImageAniFinished * 单页幻灯片播放结束 @@ -56,6 +49,13 @@ public slots: */ void initControl(); + /** + * @brief handleKeyPressEvent + * 按键处理事件 + * @param sKey + */ + void handleKeyPressEvent(const QString &sKey); + /** * @brief initImageControl * 初始化图片数据 @@ -160,6 +160,8 @@ private slots: void wheelEvent(QWheelEvent *event) override; + void keyPressEvent(QKeyEvent *event) override; + private: int m_curPageIndex = 0; bool m_canRestart = false; diff --git a/tests/uiframe/ut_centraldocpage.cpp b/tests/uiframe/ut_centraldocpage.cpp index 6e7c4f99e..e1c056527 100644 --- a/tests/uiframe/ut_centraldocpage.cpp +++ b/tests/uiframe/ut_centraldocpage.cpp @@ -1092,7 +1092,7 @@ TEST_F(TestCentralDocPage, UT_CentralDocPage_handleShortcut_004) { Stub s; s.set(ADDR(ReaderImageThreadPoolManager, addgetDocImageTask), addgetDocImageTask_stub); - s.set(ADDR(SlideWidget, handleKeyPressEvent), handleKeyPressEvent_stub); + s.set(ADDR(CentralDocPage, openSlide), openSlide_stub); QString strPath = UTSOURCEDIR; strPath += "/files/normal.pdf"; @@ -1103,7 +1103,7 @@ TEST_F(TestCentralDocPage, UT_CentralDocPage_handleShortcut_004) g_funcName.clear(); m_tester->handleShortcut(Dr::key_f5); - EXPECT_TRUE(g_funcName == "handleKeyPressEvent_stub"); + EXPECT_TRUE(g_funcName != "openSlide_stub"); delete sheet; delete slide; @@ -1117,7 +1117,6 @@ TEST_F(TestCentralDocPage, UT_CentralDocPage_handleShortcut_005) s.set(ADDR(CentralDocPage, handleBlockShutdown), handleBlockShutdown_stub); s.set(ADDR(CentralDocPage, openSlide), openSlide_stub); s.set(ADDR(CentralDocPage, openMagnifer), openMagnifer_stub); - s.set(ADDR(SlideWidget, handleKeyPressEvent), handleKeyPressEvent_stub); g_funcName.clear(); m_tester->handleShortcut(Dr::key_ctrl_s); diff --git a/tests/widgets/ut_slidewidget.cpp b/tests/widgets/ut_slidewidget.cpp index f17415e5c..7c8ec66a5 100644 --- a/tests/widgets/ut_slidewidget.cpp +++ b/tests/widgets/ut_slidewidget.cpp @@ -19,6 +19,7 @@ #include #include #include +#include namespace { void ReaderImageThreadPoolManager_addgetDocImageTask_stub(const ReaderImageParam_t &); @@ -275,11 +276,14 @@ TEST_F(TestSlideWidget, testhandleKeyPressEvent) stub.set(ADDR(SlideWidget, onPreBtnClicked), onPreBtnClicked_stub); stub.set(ADDR(SlideWidget, onNextBtnClicked), onNextBtnClicked_stub); - m_tester->handleKeyPressEvent(Dr::key_space); + QKeyEvent spaceEvent(QEvent::KeyPress, Qt::Key_Space, Qt::NoModifier); + m_tester->keyPressEvent(&spaceEvent); EXPECT_TRUE(g_funcname == "setPlayStatus_stub"); - m_tester->handleKeyPressEvent(Dr::key_left); + QKeyEvent leftEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier); + m_tester->keyPressEvent(&leftEvent); EXPECT_TRUE(g_funcname == "onPreBtnClicked_stub"); - m_tester->handleKeyPressEvent(Dr::key_right); + QKeyEvent rightEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier); + m_tester->keyPressEvent(&rightEvent); EXPECT_TRUE(g_funcname == "onNextBtnClicked_stub"); } @@ -300,4 +304,3 @@ TEST_F(TestSlideWidget, testonUpdatePageImage) m_tester->onUpdatePageImage(0); EXPECT_TRUE(g_funcname == "0"); } -