diff --git a/reader/browser/SheetBrowser.cpp b/reader/browser/SheetBrowser.cpp index 3677d4f3..957c2a6b 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 43aa4e61..a470ab8a 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 94dc67f6..2c3e5285 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 df567eb3..4f77fef2 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 4be2d37c..18ecdd88 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; };