From 09c4a1b7911cc8659b39f73229f19ba3ac8e4bf3 Mon Sep 17 00:00:00 2001 From: xiepengfei Date: Wed, 21 Oct 2026 22:17:14 +0800 Subject: [PATCH] fix: restore find widget state on tab switch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Root cause: hideFindWidget() called deleteLater() and set m_findWidget to nullptr, destroying the FindWidget on tab switch; restoreSavedViewState() had no field to save/restore search bar visibility, so switching back showed no search bar 2. Fix: add findWidgetVisible field to SheetOperation, save it in saveCurrentViewState() and restore via handlePrepareSearch() in restoreSavedViewState(); change hideFindWidget() to only hide() without destroying the widget; reorder onTabChanged() to call saveCurrentViewState() before closeFindWidget() 3. Impact: search bar visibility is preserved across tab switches; no behavior change for normal hide/show operations Log: Fixed search bar not restoring after switching document tabs Influence: 1. Test switching tabs with search bar open, verify it restores 2. Test switching tabs with search bar closed, verify no change 3. Test search functionality after multiple tab switches 4. Verify no search state leakage between documents fix: 切换标签页时恢复搜索框状态 1. 根因:hideFindWidget() 调用 deleteLater() 并将 m_findWidget 置空, 切换标签页时销毁了搜索框;restoreSavedViewState() 无搜索框可见性 字段,切回原标签页时搜索框不显示 2. 方案:SheetOperation 添加 findWidgetVisible 字段,saveCurrentViewState() 保存搜索框可见性,restoreSavedViewState() 通过 handlePrepareSearch() 恢复;hideFindWidget() 改为仅 hide() 不销毁;onTabChanged() 调整为 先 saveCurrentViewState() 再 closeFindWidget() 3. 影响:切换标签页后搜索框可见性正确恢复,正常隐藏/显示无行为变化 Log: 修复切换文档标签页后搜索框不恢复的问题 Influence: 1. 测试打开搜索框后切换标签页,验证搜索框恢复 2. 测试关闭搜索框后切换标签页,验证无变化 3. 测试多次切换标签页后搜索功能正常 4. 验证不同文档间搜索状态不串档 PMS: BUG-379133 --- reader/browser/SheetBrowser.cpp | 7 +++++-- reader/browser/SheetBrowser.h | 8 +++++++- reader/uiframe/CentralDocPage.cpp | 4 ++-- reader/uiframe/DocSheet.cpp | 7 +++++++ reader/uiframe/DocSheet.h | 2 ++ 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/reader/browser/SheetBrowser.cpp b/reader/browser/SheetBrowser.cpp index 3677d4f33..957c2a6bc 100644 --- a/reader/browser/SheetBrowser.cpp +++ b/reader/browser/SheetBrowser.cpp @@ -2121,11 +2121,14 @@ void SheetBrowser::hideFindWidget() qCDebug(appLog) << "hideFindWidget"; if (!m_findWidget.isNull()) { m_findWidget->hide(); - m_findWidget->deleteLater(); - m_findWidget = nullptr; } } +bool SheetBrowser::isFindWidgetVisible() const +{ + return !m_findWidget.isNull() && m_findWidget->isVisible(); +} + void SheetBrowser::handleSearchStart() { qCDebug(appLog) << "SheetBrowser::handleSearchStart() - Handling search start"; diff --git a/reader/browser/SheetBrowser.h b/reader/browser/SheetBrowser.h index 43aa4e611..a470ab8a1 100644 --- a/reader/browser/SheetBrowser.h +++ b/reader/browser/SheetBrowser.h @@ -281,10 +281,16 @@ class SheetBrowser : public Dtk::Widget::DGraphicsView /** * @brief hideFindWidget - * 隐藏并销毁搜索框,切换标签页时调用,防止搜索串档 + * 隐藏搜索框(不销毁),切换标签页时调用,防止搜索串档 */ void hideFindWidget(); + /** + * @brief isFindWidgetVisible + * 返回搜索框是否可见 + */ + bool isFindWidgetVisible() const; + /** * @brief jumpToNextSearchResult * 跳到下一个搜索条目中 diff --git a/reader/uiframe/CentralDocPage.cpp b/reader/uiframe/CentralDocPage.cpp index 94dc67f64..2c3e52852 100644 --- a/reader/uiframe/CentralDocPage.cpp +++ b/reader/uiframe/CentralDocPage.cpp @@ -320,9 +320,9 @@ void CentralDocPage::onTabChanged(DocSheet *sheet) // 离开当前 sheet 前,保存其阅读状态 QPointer prevSheet = qobject_cast(m_stackedLayout->currentWidget()); if (prevSheet && prevSheet != sheet && prevSheet->opened()) { - // 关闭前一个 sheet 的搜索框,防止切换标签后搜索串档 - prevSheet->closeFindWidget(); + // 先保存前一个 sheet 的阅读状态(含搜索框可见性),再关闭搜索框 prevSheet->saveCurrentViewState(); + prevSheet->closeFindWidget(); } m_stackedLayout->setCurrentWidget(sheet); diff --git a/reader/uiframe/DocSheet.cpp b/reader/uiframe/DocSheet.cpp index df567eb35..4f77fef21 100644 --- a/reader/uiframe/DocSheet.cpp +++ b/reader/uiframe/DocSheet.cpp @@ -1911,6 +1911,8 @@ void DocSheet::saveCurrentViewState() // 保存滚动位置 if (m_browser) { m_operation.scrollPosition = m_browser->getScrollPosition(); + // 保存搜索框可见性 + m_operation.findWidgetVisible = m_browser->isFindWidgetVisible(); } // 保存侧边栏宽度和展开状态 if (m_sidebar && m_sidebar->isVisible()) { @@ -1948,6 +1950,11 @@ void DocSheet::restoreSavedViewState() beginRestoreGuard(false); } } + + // 恢复搜索框可见性 + if (m_browser && m_operation.findWidgetVisible) { + m_browser->handlePrepareSearch(); + } } void DocSheet::beginRestoreGuard(bool notifyTip) diff --git a/reader/uiframe/DocSheet.h b/reader/uiframe/DocSheet.h index 4be2d37cd..18ecdd886 100644 --- a/reader/uiframe/DocSheet.h +++ b/reader/uiframe/DocSheet.h @@ -51,6 +51,8 @@ struct SheetOperation { bool sidebarWidthChanged = false; // 滚动位置(纵向偏移比例 0.0~1.0) float scrollPosition = 0.0f; + // 搜索框可见性 + bool findWidgetVisible = false; // 目录树展开节点标题路径列表(如 ["1.概述", "1.概述/1.1 背景"]) QStringList expandedSections; };