Skip to content

Fixed: Title bar theme issue in Thor Mode#527

Open
JWWTSL wants to merge 1 commit into
linuxdeepin:masterfrom
JWWTSL:test0426
Open

Fixed: Title bar theme issue in Thor Mode#527
JWWTSL wants to merge 1 commit into
linuxdeepin:masterfrom
JWWTSL:test0426

Conversation

@JWWTSL
Copy link
Copy Markdown
Contributor

@JWWTSL JWWTSL commented Apr 29, 2026

Log: Optimized the logic for triggering updates

pms: bug-355415

Log: Optimized the logic for triggering updates

pms: bug-355415
@deepin-ci-robot
Copy link
Copy Markdown

deepin pr auto review

这段代码主要实现了标题栏(TitleBar)在 DTK(Deepin Tool Kit)环境下对主题切换和调色板变化的响应,通过重绘来确保背景色正确。以下是对这段代码的详细审查,包括语法逻辑、代码质量、性能和安全性方面的改进意见:

1. 语法逻辑与代码结构

优点:

  • 事件处理覆盖全面:代码同时处理了 DGuiApplicationHelper::themeTypeChanged 信号、QGuiApplication::paletteChanged 信号以及 QEvent::PaletteChange 事件。这种多重保障机制确保了无论是通过 DTK 信号、Qt 信号还是系统事件触发,界面都能及时刷新。
  • Lambda 表达式使用得当:在构造函数中使用 Lambda 连接信号,代码紧凑且上下文清晰。
  • Override 关键字:在头文件中为重写的虚函数添加了 override 关键字,这是良好的 C++ 实践,有助于编译器检查错误。

改进建议:

  • 潜在的重绘冗余

    • 问题changeEvent 中捕获了 QEvent::ApplicationPaletteChangeQEvent::PaletteChange。同时,构造函数中连接了 DGuiApplicationHelper::themeTypeChangedQGuiApplication::paletteChanged
    • 分析:当主题或调色板变化时,Qt 的事件循环通常会发送 PaletteChange 事件。如果信号连接和事件处理都触发 update(),可能会导致短时间内多次重绘。
    • 建议:通常情况下,重写 changeEvent 处理 QEvent::PaletteChange 已经足够覆盖大部分场景。如果 DTK 的 themeTypeChanged 信号不一定会触发 Qt 的 PaletteChange 事件,则保留信号连接。建议保留信号连接(因为 DTK 有时独立于 Qt 事件处理主题),但可以简化 changeEvent,或者确认是否真的需要同时响应 ApplicationPaletteChangePaletteChange(通常响应 PaletteChange 即可)。
  • 构造函数中的静态转换

    • 代码static_cast<QGuiApplication *>(qApp)
    • 风险:虽然在这个上下文中 qApp 通常指向 QGuiApplicationQApplication,但如果项目配置不当,这种强转可能存在风险。
    • 建议:使用 qobject_cast 更安全,它能进行运行时类型检查,如果类型不匹配会返回 nullptr
    • 修改代码
      auto guiApp = qobject_cast<QGuiApplication *>(qApp);
      if (guiApp) {
          connect(guiApp, &QGuiApplication::paletteChanged, this, [this](){ update(); });
      }

2. 代码质量

优点:

  • 命名规范:变量和函数命名符合 Qt/C++ 常规规范。
  • 注释清晰:代码中添加了中文注释,解释了连接信号的目的,有助于维护。

改进建议:

  • 头文件包含顺序

    • 建议遵循标准的包含顺序:对应的头文件 -> C 标准库 -> C++ 标准库 -> Qt 库 -> 第三方库(DTK) -> 项目内部头文件。虽然目前的顺序不影响编译,但规范顺序有助于提高可读性和减少依赖问题。
    • 当前代码混用了 Qt 和 DTK 头文件,建议将 DTK 相关的放在一起。
  • Lambda 捕获

    • [this]() 捕获方式是正确的。如果 Lambda 体非常简单(如仅调用 update()),也可以考虑直接写成 [this]{ update(); },省略参数列表括号,但这属于风格偏好。

3. 代码性能

改进建议:

  • 频繁的调色板查询
    • 问题:在 paintEvent 中,每次重绘都会调用 DGuiApplicationHelper::instance()->applicationPalette()。虽然这通常很快,但在高频重绘场景下(例如窗口快速拖动调整大小),不必要的函数调用和对象查找会增加开销。
    • 建议:考虑到调色板变化频率远低于重绘频率,可以在 changeEvent 或槽函数中缓存当前的背景色,在 paintEvent 中直接使用缓存的颜色。
    • 修改示例
      titlebar.h 中添加成员变量:
      QColor m_bgColor;
      titlebar.cpp 中:
      // 初始化时或 changeEvent 中更新颜色
      void TitleBar::updateBackgroundColor() {
          m_bgColor = DGuiApplicationHelper::instance()->applicationPalette().color(QPalette::Base);
      }
      
      void TitleBar::paintEvent(QPaintEvent *event) {
          Q_UNUSED(event)
          QPainter p(this);
          p.fillRect(rect(), m_bgColor); // 使用缓存的颜色
      }
      
      void TitleBar::changeEvent(QEvent *event) {
          if (event->type() == QEvent::PaletteChange) {
              updateBackgroundColor();
              update();
          }
          QWidget::changeEvent(event);
      }
      注:这会增加一点内存开销(一个 QColor 对象),但能减少重绘时的计算开销。

4. 代码安全

改进建议:

  • 空指针检查

    • 在调用 DGuiApplicationHelper::instance() 时,理论上 DTK 环境下不应为空,但为了代码的健壮性,如果是在插件或动态库中使用,建议增加判空逻辑,尽管在主应用程序中通常可以省略。
  • 资源管理

    • QPainter p(this); 创建了基于 this 的 QPainter。这是安全的,因为它会在函数结束时自动销毁并释放资源。

总结修改建议

综合以上分析,以下是优化后的代码片段建议:

titlebar.cpp 修改建议:

// ... includes ...

TitleBar::TitleBar(QWidget *parent) : QWidget(parent), m_layout(new QHBoxLayout(this))
{
    // ... 初始化代码 ...

    // 初始化背景色缓存
    updateBackgroundColor();

    // 监听 DTK 主题类型变化
    QObject::connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [this](){
        updateBackgroundColor();
        update();
    });

    // 监听 QApplication 全局调色板变化
    // 使用 qobject_cast 进行更安全的类型转换
    if (auto *guiApp = qobject_cast<QGuiApplication *>(qApp)) {
        QObject::connect(guiApp, &QGuiApplication::paletteChanged, this, [this](const QPalette &) {
            updateBackgroundColor();
            update();
        });
    }
    // ...
}

void TitleBar::updateBackgroundColor()
{
    if (auto *helper = DGuiApplicationHelper::instance()) {
        m_bgColor = helper->applicationPalette().color(QPalette::Base);
    }
}

void TitleBar::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    QPainter p(this);
    // 使用成员变量中缓存的背景色,避免频繁查询
    p.fillRect(rect(), m_bgColor);
}

void TitleBar::changeEvent(QEvent *event)
{
    // 只需要捕获 PaletteChange 即可,ApplicationPaletteChange 通常包含在其中或由信号处理
    if (event->type() == QEvent::PaletteChange) {
        updateBackgroundColor();
        update();
    }
    QWidget::changeEvent(event);
}

titlebar.h 修改建议:

class TitleBar : public QWidget
{
    Q_OBJECT
public:
    // ...
    
protected:
    void paintEvent(QPaintEvent *event) override;
    void changeEvent(QEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;

private:
    void updateBackgroundColor(); // 新增辅助函数

    // ... 其他成员变量 ...
    QColor m_bgColor; // 新增缓存背景色
};

这些改进主要提升了代码的类型安全性、运行时性能(通过缓存减少调用开销)以及逻辑的清晰度。

@deepin-ci-robot
Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: JWWTSL, lzwind

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@deepin-bot
Copy link
Copy Markdown
Contributor

deepin-bot Bot commented May 9, 2026

TAG Bot

New tag: 6.5.34
DISTRIBUTION: unstable
Suggest: synchronizing this PR through rebase #530

@deepin-bot
Copy link
Copy Markdown
Contributor

deepin-bot Bot commented May 14, 2026

TAG Bot

New tag: 6.5.35
DISTRIBUTION: unstable
Suggest: synchronizing this PR through rebase #534

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants