From cc015ee82636c753013bf22b2f28680dddfe2b8a Mon Sep 17 00:00:00 2001 From: gongheng Date: Fri, 30 Oct 2026 04:39:05 +0800 Subject: [PATCH] fix: use display-aware resolution for sidebar thumbnails MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Root cause: PageRenderThread hardcoded 174x174 render resolution while display side draws at 174*pixScale*dpr, causing Qt upscaling blur when sidebar is widened or on HiDPI displays 2. Fix: add pixScale field to DocPageThumbnailTask, set it from adaptScale property at both task creation sites, compute render size as 174*pixScale*dpr in execNextDocPageThumbnailTask 3. Impact: thumbnails now render at display-matched resolution; default pixScale=1.0 and dpr=1.0 preserves existing behavior Log: Fix blurred sidebar thumbnails in document viewer Influence: 1. Test thumbnail clarity at default sidebar width (266px) 2. Test thumbnail clarity after widening sidebar (125%-200%) 3. Test thumbnail clarity on HiDPI 2x displays 4. Verify dark-theme thumbnail inversion still works 5. Verify XPS document thumbnail performance unaffected fix: 修复侧边栏缩略图模糊问题 1. 根因:PageRenderThread 渲染缩略图时硬编码 174x174 分辨率,而显示侧 按 174*pixScale*dpr 绘制,侧边栏变宽或 HiDPI 设备上 Qt 放大导致模糊 2. 方案:DocPageThumbnailTask 新增 pixScale 字段,两个 task 创建点从 adaptScale 属性读取赋值,渲染时按 174*pixScale*dpr 计算实际渲染尺寸 3. 影响:缩略图按显示匹配分辨率渲染;pixScale=1.0 且 dpr=1.0 时行为不变 Log: 修复文档查看器侧边栏缩略图模糊问题 Influence: 1. 测试默认侧边栏宽度(266px)下缩略图清晰度 2. 测试拖宽侧边栏后(125%-200%)缩略图清晰度 3. 测试 HiDPI 2x 屏幕下缩略图清晰度 4. 验证深色主题缩略图反色功能不受影响 5. 验证 XPS 文档缩略图性能不受影响 PMS: BUG-173857 --- reader/browser/PageRenderThread.cpp | 10 +++++++--- reader/browser/PageRenderThread.h | 1 + reader/sidebar/SideBarImageViewModel.cpp | 2 ++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/reader/browser/PageRenderThread.cpp b/reader/browser/PageRenderThread.cpp index 906f5da8d..4c4c44d3b 100644 --- a/reader/browser/PageRenderThread.cpp +++ b/reader/browser/PageRenderThread.cpp @@ -814,13 +814,17 @@ bool PageRenderThread::execNextDocPageThumbnailTask() return true; } - QImage image = task.renderer->getImage(task.index, 174, 174); + // 渲染分辨率需匹配显示侧实际尺寸(174 * pixScale * dpr),避免源图像被 + // Qt painter 上采样放大导致模糊;pixScale 由 task 从 UI 层传入 + int renderSize = static_cast(174 * task.pixScale * dApp->devicePixelRatio()); + + QImage image = task.renderer->getImage(task.index, renderSize, renderSize); if (!image.isNull()) { // 预取图片对象 bbox(夜间/深色蒙版用):在工作线程取,避免 UI 线程与渲染争文档锁; - // 与 getImage 同尺寸(174,174)请求,蒙版与缩略图输出像素一一对齐 + // 与 getImage 同尺寸请求,蒙版与缩略图输出像素一一对齐 if (DocSheet::existSheetByUuid(task.uuid) && task.renderer->opened()) { - task.imageRects = task.renderer->getImageObjectRects(task.index, 174, 174); + task.imageRects = task.renderer->getImageObjectRects(task.index, renderSize, renderSize); } emit sigDocPageThumbnailTaskFinished(task, QPixmap::fromImage(image)); } diff --git a/reader/browser/PageRenderThread.h b/reader/browser/PageRenderThread.h index 0b8ff46bb..6215d4076 100644 --- a/reader/browser/PageRenderThread.h +++ b/reader/browser/PageRenderThread.h @@ -83,6 +83,7 @@ struct DocPageThumbnailTask {//缩略图 DocSheet *sheet = nullptr; SideBarImageViewModel *model = nullptr; int index = -1; + qreal pixScale = 1.0; //侧边栏缩放因子(adaptScale),渲染分辨率 = 174 * pixScale * dpr QVector imageRects; //图片对象 bbox(夜间/深色蒙版用,与缩略图像素对齐,worker线程预取) }; diff --git a/reader/sidebar/SideBarImageViewModel.cpp b/reader/sidebar/SideBarImageViewModel.cpp index 3d64d743b..9cb92f987 100644 --- a/reader/sidebar/SideBarImageViewModel.cpp +++ b/reader/sidebar/SideBarImageViewModel.cpp @@ -131,6 +131,7 @@ QVariant SideBarImageViewModel::data(const QModelIndex &index, int role) const task.model = const_cast(this); task.renderer = m_sheet ? m_sheet->rendererPtr() : nullptr; task.uuid = m_sheet ? m_sheet->uuid() : QString(); + task.pixScale = m_parent ? m_parent->property("adaptScale").toDouble() : 1.0; PageRenderThread::appendTask(task); } @@ -204,6 +205,7 @@ void SideBarImageViewModel::onUpdateImage(int index) task.index = index; task.model = const_cast(this); task.renderer = m_sheet ? m_sheet->rendererPtr() : nullptr; + task.pixScale = m_parent ? m_parent->property("adaptScale").toDouble() : 1.0; task.uuid = m_sheet ? m_sheet->uuid() : QString(); PageRenderThread::appendTask(task); qCDebug(appLog) << "Updating image for index:" << index << "end";