From 0d74ce607aeb6164162fe71fa0b76102b7479e1c Mon Sep 17 00:00:00 2001 From: xiepengfei Date: Wed, 21 Oct 2026 22:18:34 +0800 Subject: [PATCH] fix: restore find widget visibility on tab switch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Root cause: commit 78deba7c introduced deleteLater() + nullptr in hideFindWidget(), destroying FindWidget on tab switch; restoreSavedViewState() lacked findWidgetVisible field so search box never reappeared 2. Fix: add findWidgetVisible to SheetOperation, save it in saveCurrentViewState(), restore via handlePrepareSearch() in restoreSavedViewState(); change hideFindWidget() to hide() only, removing deleteLater() and nullptr assignment 3. Impact: FindWidget survives tab switches preserving search text; stopSearch() still called before hide prevents search cross-contamination regression (bug 376317) Log: fix search box disappearing after switching tabs in multi-tab mode Influence: 1. Test search box visibility after switching between tabs 2. Verify search text is preserved after tab switch 3. Verify no search cross-contamination between tabs fix: 修复切换标签页后搜索框不显示的问题 1. 根因:commit 78deba7c 在 hideFindWidget() 中引入 deleteLater() 和 nullptr 赋值,切换标签页时销毁了 FindWidget; restoreSavedViewState() 缺少 findWidgetVisible 字段,切回时 无法恢复搜索框显示 2. 方案:SheetOperation 添加 findWidgetVisible 字段, saveCurrentViewState() 保存搜索框可见性,restoreSavedViewState() 通过 handlePrepareSearch() 恢复;hideFindWidget() 改为仅 hide() 移除 deleteLater() 和 nullptr 赋值 3. 影响:FindWidget 在标签页切换后存活并保留搜索文本; stopSearch() 仍在 hide 前调用,防止搜索串档回归(bug 376317) Log: 修复多标签页模式下切换标签页后搜索框消失的问题 Influence: 1. 测试切换标签页后搜索框可见性恢复 2. 验证切换标签页后搜索文本保留 3. 验证标签页间无搜索串档回归 PMS: BUG-379133 --- reader/browser/SheetBrowser.cpp | 7 +++++-- reader/browser/SheetBrowser.h | 8 +++++++- reader/uiframe/CentralDocPage.cpp | 4 ++-- reader/uiframe/DocSheet.cpp | 6 ++++++ reader/uiframe/DocSheet.h | 2 ++ 5 files changed, 22 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..69d05310b 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..762c34eb1 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(); + // 先保存阅读状态(含搜索框可见性),再关闭搜索框,防止切换标签后搜索串档 prevSheet->saveCurrentViewState(); + prevSheet->closeFindWidget(); } m_stackedLayout->setCurrentWidget(sheet); diff --git a/reader/uiframe/DocSheet.cpp b/reader/uiframe/DocSheet.cpp index df567eb35..d8f65e99d 100644 --- a/reader/uiframe/DocSheet.cpp +++ b/reader/uiframe/DocSheet.cpp @@ -1911,6 +1911,7 @@ void DocSheet::saveCurrentViewState() // 保存滚动位置 if (m_browser) { m_operation.scrollPosition = m_browser->getScrollPosition(); + m_operation.findWidgetVisible = m_browser->isFindWidgetVisible(); } // 保存侧边栏宽度和展开状态 if (m_sidebar && m_sidebar->isVisible()) { @@ -1927,6 +1928,11 @@ void DocSheet::restoreSavedViewState() if (!opened()) return; + // 恢复搜索框可见性 + if (m_browser && m_operation.findWidgetVisible) { + m_browser->handlePrepareSearch(); + } + // 恢复侧边栏宽度(仅当用户主动调整过时才恢复) if (m_sidebar && m_sidebar->isVisible() && m_operation.sidebarWidthChanged && m_operation.sidebarWidth > 0) { QTimer::singleShot(kRestoreCatalogDelayMs, this, [this]() { diff --git a/reader/uiframe/DocSheet.h b/reader/uiframe/DocSheet.h index 4be2d37cd..9f7913a51 100644 --- a/reader/uiframe/DocSheet.h +++ b/reader/uiframe/DocSheet.h @@ -53,6 +53,8 @@ struct SheetOperation { float scrollPosition = 0.0f; // 目录树展开节点标题路径列表(如 ["1.概述", "1.概述/1.1 背景"]) QStringList expandedSections; + // 搜索框可见性(标签页切换时保存/恢复) + bool findWidgetVisible = false; }; DWIDGET_BEGIN_NAMESPACE