From 45f28e421c85d86551ad0a7de1fb033f14a9a7fb Mon Sep 17 00:00:00 2001 From: gongheng Date: Tue, 8 Sep 2026 15:00:49 +0800 Subject: [PATCH] fix(reader): close FindWidget on tab switch to prevent cross-document search When switching between document tabs, the FindWidget (whose parent is the MainWindow, not the SheetBrowser) remained visible with its m_docSheet pointer still bound to the previous document. Searching from this stale widget executed the search on the wrong document. Add SheetBrowser::hideFindWidget() to hide and destroy the FindWidget, DocSheet::closeFindWidget() to stop the search and hide the widget, and call prevSheet->closeFindWidget() in CentralDocPage::onTabChanged() before switching to the new tab. Log: fix issue Bug: https://pms.uniontech.com/bug-view-376317.html --- reader/browser/SheetBrowser.cpp | 12 ++++++++++-- reader/browser/SheetBrowser.h | 9 +++++++-- reader/uiframe/CentralDocPage.cpp | 8 ++++++-- reader/uiframe/DocSheet.cpp | 10 ++++++++-- reader/uiframe/DocSheet.h | 9 +++++++-- 5 files changed, 38 insertions(+), 10 deletions(-) diff --git a/reader/browser/SheetBrowser.cpp b/reader/browser/SheetBrowser.cpp index 43b86e359..0623f83f6 100644 --- a/reader/browser/SheetBrowser.cpp +++ b/reader/browser/SheetBrowser.cpp @@ -1,5 +1,4 @@ -// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd. -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2019 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -1735,6 +1734,15 @@ void SheetBrowser::jumpToPrevSearchResult() } } +void SheetBrowser::hideFindWidget() +{ + if (!m_findWidget.isNull()) { + m_findWidget->hide(); + m_findWidget->deleteLater(); + m_findWidget = nullptr; + } +} + void SheetBrowser::handleSearchStart() { m_searchCurIndex = 0; diff --git a/reader/browser/SheetBrowser.h b/reader/browser/SheetBrowser.h index 91578206d..13802b727 100644 --- a/reader/browser/SheetBrowser.h +++ b/reader/browser/SheetBrowser.h @@ -1,5 +1,4 @@ -// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd. -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2019 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -262,6 +261,12 @@ class SheetBrowser : public Dtk::Widget::DGraphicsView */ void handlePrepareSearch(); + /** + * @brief hideFindWidget + * 隐藏并销毁搜索框,切换标签页时调用,防止搜索串档 + */ + void hideFindWidget(); + /** * @brief jumpToNextSearchResult * 跳到下一个搜索条目中 diff --git a/reader/uiframe/CentralDocPage.cpp b/reader/uiframe/CentralDocPage.cpp index bfa140ef5..9c4f16618 100644 --- a/reader/uiframe/CentralDocPage.cpp +++ b/reader/uiframe/CentralDocPage.cpp @@ -1,5 +1,4 @@ -// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd. -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2019 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -275,6 +274,11 @@ void CentralDocPage::onOpened(DocSheet *sheet, deepin_reader::Document::Error er void CentralDocPage::onTabChanged(DocSheet *sheet) { if (nullptr != sheet) { + // 关闭前一个 sheet 的搜索框,防止切换标签后搜索串档 + QPointer prevSheet = qobject_cast(m_stackedLayout->currentWidget()); + if (prevSheet && prevSheet != sheet && prevSheet->opened()) { + prevSheet->closeFindWidget(); + } m_stackedLayout->setCurrentWidget(sheet); sheet->defaultFocus(); diff --git a/reader/uiframe/DocSheet.cpp b/reader/uiframe/DocSheet.cpp index 0687e5ea4..11a86a3f4 100644 --- a/reader/uiframe/DocSheet.cpp +++ b/reader/uiframe/DocSheet.cpp @@ -1,5 +1,4 @@ -// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd. -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2019 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -1129,6 +1128,13 @@ void DocSheet::jumpToPrevSearchResult() m_browser->jumpToPrevSearchResult(); } +void DocSheet::closeFindWidget() +{ + stopSearch(); + if (m_browser) + m_browser->hideFindWidget(); +} + void DocSheet::stopSearch() { m_searchTask->stopSearch(); diff --git a/reader/uiframe/DocSheet.h b/reader/uiframe/DocSheet.h index 053cbbb55..6fca5e2e3 100644 --- a/reader/uiframe/DocSheet.h +++ b/reader/uiframe/DocSheet.h @@ -1,5 +1,4 @@ -// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd. -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2019 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -576,6 +575,12 @@ class DocSheet : public Dtk::Widget::DSplitter */ void jumpToPrevSearchResult(); + /** + * @brief closeFindWidget + * 关闭搜索框并停止搜索,切换标签页时调用 + */ + void closeFindWidget(); + /** * @brief showEncryPage * 显示解锁页面