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..69d05310 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..762c34eb 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 df567eb3..d8f65e99 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 4be2d37c..9f7913a5 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