Skip to content

fix(style): fix visual artifacts after deselecting list items at highDPI#307

Merged
deepin-bot[bot] merged 1 commit intolinuxdeepin:masterfrom
add-uos:master
Mar 9, 2026
Merged

fix(style): fix visual artifacts after deselecting list items at highDPI#307
deepin-bot[bot] merged 1 commit intolinuxdeepin:masterfrom
add-uos:master

Conversation

@add-uos
Copy link
Contributor

@add-uos add-uos commented Mar 9, 2026

Use setClipRect to limit drawing area and prevent antialiasing artifacts from extending beyond item boundaries.

使用setClipRect限制绘制区域,防止反锯齿伪影超出item边界。

Log: 修复高DPI缩放下列表项取消选中后的视觉残留问题
PMS: BUG-332513
Influence: 修复后在125%及更高DPI缩放下,列表项取消选中后不再出现视觉残留横线,同时保持圆角平滑效果,不影响其他项的正常显示。

… DPI

Use setClipRect to limit drawing area and prevent antialiasing artifacts
from extending beyond item boundaries.

使用setClipRect限制绘制区域,防止反锯齿伪影超出item边界。

Log: 修复高DPI缩放下列表项取消选中后的视觉残留问题
PMS: BUG-332513
Influence: 修复后在125%及更高DPI缩放下,列表项取消选中后不再出现视觉残留横线,同时保持圆角平滑效果,不影响其他项的正常显示。
@deepin-ci-robot
Copy link
Contributor

deepin pr auto review

这段代码修改主要涉及 Qt 样式绘制逻辑的调整,特别是在处理列表项选中状态时的绘制行为。以下是对该 git diff 的详细审查意见:

1. 语法逻辑

  • 版权年份更新SPDX-FileCopyrightText 从 2024 更新至 2026。这在语法上是合法的,属于常规的版权维护操作。
  • 缩进修正:原代码中 QRect select_rect = opt->rect; 及后续代码存在缩进不一致(3个空格),修改后统一为4个空格,符合代码规范。
  • 绘图状态管理
    • 新增了 p->save()p->restore()。这是一个非常重要的逻辑改进。
    • 原因QPainter 的状态(如画笔、画刷、裁剪区域、渲染提示等)是全局的。如果在函数中修改了这些状态(如 setPensetRenderHint),而不恢复,将会影响后续在该 painter 上进行的绘制操作。
    • 新增 setClipRect(opt->rect):这限制了绘制区域仅在 opt->rect 内部。这是一个逻辑上的增强,防止圆角矩形绘制时超出视图项的边界,特别是在圆角半径较大或矩形靠近边缘时,避免绘制到相邻项或其他控件上。

2. 代码质量

  • 健壮性提升:通过 save()restore() 保护了 QPainter 的状态栈,避免了状态污染。这显著提高了代码的健壮性,防止了因状态残留导致的 UI 渲染错误。
  • 边界保护setClipRect 的增加使得绘制逻辑更加严密,确保视觉效果符合预期,不会出现"溢出"绘制。
  • 代码可读性:修改后的代码块结构清晰,缩进统一,易于阅读和维护。

3. 代码性能

  • 潜在的性能影响
    • save()restore() 操作涉及 QPainter 内部状态栈的入栈和出栈,会有微小的性能开销。
    • setClipRect 会增加图形处理的复杂度(通常涉及硬件裁剪区域的计算),对性能有一定影响。
  • 权衡分析
    • 虽然有轻微的性能损耗,但考虑到这是在 UI 渲染线程中,且列表项选中状态的绘制频率通常不是极高(相比于滚动时的重绘),这种为了正确性和视觉效果而牺牲的微小性能是完全可以接受的。在现代计算机上,这种开销几乎可以忽略不计。
  • 优化建议:如果该函数被极高频率地调用(例如每秒数千次),且经过性能分析(profiling)确认为瓶颈,可以考虑仅在必要时开启裁剪或抗锯齿,但目前的实现是平衡了正确性和性能的最佳实践。

4. 代码安全

  • 资源安全save()restore() 的配对使用保证了 QPainter 状态栈的平衡,防止了因多次调用 save() 而未 restore() 导致的栈溢出或状态混乱。
  • 内存安全:代码中未涉及动态内存分配,不存在内存泄漏风险。
  • 逻辑安全setClipRect 防止了绘制越界,从逻辑上保证了 UI 的安全性,避免了可能因绘制内容覆盖敏感区域或破坏其他控件渲染而导致的潜在问题。

总结与改进建议

这段代码修改是高质量的,主要解决了绘图状态污染和绘制越界的问题。

改进建议:

  1. 确认 getColor 的安全性:虽然 diff 中未展示 getColor 函数的实现,但建议确保该函数在 opt 为空或 QPalette::Highlight 无效时能安全处理(例如返回默认颜色),避免潜在的空指针解引用或无效颜色设置。
  2. 注释说明:建议在 p->setClipRect(opt->rect); 处添加简短注释,说明设置裁剪区域是为了防止圆角绘制溢出,方便后续维护者理解意图。
  3. 常量一致性:检查 PM_FrameRadiusSE_ItemViewItemText 等常量在项目中的定义是否统一,避免魔法数字或枚举值混用。

总体而言,这是一个很好的代码优化提交,提升了 UI 渲染的稳定性和准确性。

@deepin-ci-robot
Copy link
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: 18202781743, add-uos

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

@add-uos
Copy link
Contributor Author

add-uos commented Mar 9, 2026

/forcemerge

@deepin-bot
Copy link
Contributor

deepin-bot bot commented Mar 9, 2026

This pr force merged! (status: unstable)

@deepin-bot deepin-bot bot merged commit 28b49f3 into linuxdeepin:master Mar 9, 2026
21 of 22 checks passed
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