From b5d73ff2db2cccb7915bbc1c235aec12d8af8f67 Mon Sep 17 00:00:00 2001 From: zhangjiarui Date: Mon, 21 Sep 2026 22:05:50 +0800 Subject: [PATCH] fix(reader): fix scrollbar invisible in dark mode by forcing light scrollbar palette MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 主题更新时强制两个滚动条的 QPalette::Base 为浅色,使滑块恒为深色; 2. 构造函数中连接 themeTypeChanged 并立即应用,覆盖深色模式下的初始状态; 3. 不改变视口/护眼模式背景逻辑,避免与 EyeProtectionManager 冲突; ===================================== 1. forced QPalette::Base of both scrollbars to a light color on theme update so the handle is always drawn dark; 2. connected themeTypeChanged and applied it immediately in the constructor to cover the initial dark-mode state; 3. left the viewport/eye-protection background logic untouched to avoid conflicting with EyeProtectionManager; Log: 修复深色模式下文档查看器滚动条透明不可见的问题,放大文档后滚动条清晰可辨 PMS: BUG-374553 --- reader/browser/SheetBrowser.cpp | 21 ++++++++++++++++++++- reader/browser/SheetBrowser.h | 6 ++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/reader/browser/SheetBrowser.cpp b/reader/browser/SheetBrowser.cpp index 8a7703425..9a30f1550 100644 --- a/reader/browser/SheetBrowser.cpp +++ b/reader/browser/SheetBrowser.cpp @@ -118,7 +118,11 @@ SheetBrowser::SheetBrowser(DocSheet *parent) : DGraphicsView(parent), m_sheet(pa QPalette pal = viewport()->palette(); pal.setColor(viewport()->backgroundRole(), EyeProtectionManager::instance()->viewportBackgroundColor()); viewport()->setPalette(pal); - + + // 主题切换时同步滚动条调色板,保证深色模式下滑块可见 + connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &SheetBrowser::onUpdateTheme); + onUpdateTheme(); + qCDebug(appLog) << "SheetBrowser constructor completed"; } @@ -2474,3 +2478,18 @@ void SheetBrowser::restoreScrollPosition(float position) vBar->setValue(value); qCDebug(appLog) << "restoreScrollPosition set value=" << value << "-> after val=" << vBar->value(); } + +void SheetBrowser::onUpdateTheme() +{ + // 文档页面与视口背景恒为浅色,而 DTK ChameleonStyle 依据滚动条 palette(Base) + // 的明暗决定滑块颜色:深色模式下 Base 为深色会绘制白色半透明滑块,在浅色 + // 背景上不可见。此处强制 Base 为浅色,使滑块始终为深色,保证滚动条清晰可见。 + const QPalette appPalette = DGuiApplicationHelper::instance()->applicationPalette(); + auto syncScrollBarPalette = [&appPalette](QScrollBar *bar) { + QPalette barPalette = appPalette; + barPalette.setColor(QPalette::Base, Qt::white); + bar->setPalette(barPalette); + }; + syncScrollBarPalette(verticalScrollBar()); + syncScrollBarPalette(horizontalScrollBar()); +} diff --git a/reader/browser/SheetBrowser.h b/reader/browser/SheetBrowser.h index f8de05115..f1ffe99dc 100644 --- a/reader/browser/SheetBrowser.h +++ b/reader/browser/SheetBrowser.h @@ -579,6 +579,12 @@ private slots: */ void onRemoveIconAnnotSelect(); + /** + * @brief onUpdateTheme + * 主题变化时更新滚动条调色板,确保深色模式下滚动条颜色正确 + */ + void onUpdateTheme(); + private: /** * @brief calcIconAnnotRect