Skip to content

Commit dba1e1e

Browse files
committed
Fixed: Title bar theme issue in Thor Mode
Log: Optimized the logic for triggering updates pms: bug-355415
1 parent 73d83c1 commit dba1e1e

2 files changed

Lines changed: 42 additions & 2 deletions

File tree

src/views/titlebar.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@
77
#include "utils.h"
88

99
#include <DApplication>
10+
#include <DGuiApplicationHelper>
1011
#include <DIconButton>
1112

13+
#include <QGuiApplication>
1214
#include <QIcon>
15+
#include <QPainter>
1316
#include <QLabel>
1417
#include <QDebug>
1518
#include <QMouseEvent>
@@ -37,6 +40,19 @@ TitleBar::TitleBar(QWidget *parent) : QWidget(parent), m_layout(new QHBoxLayout(
3740
// this->setPalette(palette);
3841
this->setBackgroundRole(DPalette::Base);
3942
this->setAutoFillBackground(true);
43+
44+
// 监听 DTK 主题类型变化,触发重绘(切换深/浅色时)
45+
QObject::connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [this](){
46+
update();
47+
});
48+
49+
// 监听 QApplication 全局调色板变化:DTK 通过 D-Bus 异步完成 palette 初始化时
50+
// 会调用 QApplication::setPalette(),从而触发此信号。这是修复首次启动白色背景
51+
// 的关键——确保 TitleBar 在 DTK 异步就绪后立即重绘。
52+
QObject::connect(static_cast<QGuiApplication *>(qApp), &QGuiApplication::paletteChanged,
53+
this, [this](const QPalette &) {
54+
update();
55+
});
4056
/********************* Modify by m000714 daizhengwen End ************************/
4157
m_layout->setContentsMargins(0, 0, 0, 0);
4258

@@ -78,6 +94,28 @@ void TitleBar::setVerResized(bool resized)
7894
}
7995

8096

97+
void TitleBar::paintEvent(QPaintEvent *event)
98+
{
99+
Q_UNUSED(event)
100+
// 优先读取 DTK 应用级调色板(applicationPalette),如与 widget 继承 palette 不一致
101+
// 时以 DTK 的为准,保证深/浅主题均正确渲染。
102+
// setAutoFillBackground(true) 已在构造时开启,作为 Qt 层面的兜底绘制;
103+
// 此 paintEvent 覆盖在其之上,确保每次重绘都实时读取最新 palette。
104+
QPainter p(this);
105+
const QColor bgColor = DGuiApplicationHelper::instance()->applicationPalette().color(QPalette::Base);
106+
p.fillRect(rect(), bgColor);
107+
}
108+
109+
void TitleBar::changeEvent(QEvent *event)
110+
{
111+
// 捕获系统/应用 palette 变化事件,触发重绘以保持颜色正确
112+
if (event->type() == QEvent::ApplicationPaletteChange
113+
|| event->type() == QEvent::PaletteChange) {
114+
update();
115+
}
116+
QWidget::changeEvent(event);
117+
}
118+
81119
void TitleBar::mousePressEvent(QMouseEvent *event)
82120
{
83121
// qCDebug(views) << "Enter TitleBar::mousePressEvent";

src/views/titlebar.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,10 @@ class TitleBar : public QWidget
5050
int m_verResizedCurOff = 0;//当前垂直偏移量
5151
bool m_verResizedEnabled = false;//是否手动resize当前界面
5252
protected:
53-
void mousePressEvent(QMouseEvent *event);
54-
void mouseMoveEvent(QMouseEvent *event);
53+
void paintEvent(QPaintEvent *event) override;
54+
void changeEvent(QEvent *event) override;
55+
void mousePressEvent(QMouseEvent *event) override;
56+
void mouseMoveEvent(QMouseEvent *event) override;
5557
};
5658

5759
#endif // TITLEBAR_H

0 commit comments

Comments
 (0)