You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HiDPI屏幕下QPainter.drawText绘制系统托盘文字模糊如何解决

核心原因:

  1. 未给QPixmap设置匹配HiDPI的设备像素比,Qt渲染时会将高分辨率图源当成普通分辨率图源拉伸,导致模糊
  2. 手动设置字体拉伸参数破坏了字体原生hinting规则,额外降低了文字清晰度

修改方案

  1. 保留你原有上下文代码中HiDPI相关属性的设置,注意这两行必须放在QApplication实例化之前,顺序不要改
  2. 图标生成逻辑按以下代码调整:
# 先获取当前设备的像素比
device_pixel_ratio = app.devicePixelRatio()
# 托盘图标实际逻辑显示高度,可根据你桌面的托盘图标大小调整,Ubuntu 20.04默认值为24
tray_logic_height = 24

# 生成高分辨率Pixmap,物理尺寸=逻辑尺寸*设备像素比
pixmap = QtGui.QPixmap(tray_logic_height * 2 * device_pixel_ratio, tray_logic_height * device_pixel_ratio)
# 关键配置:告知Qt当前Pixmap的设备像素比,避免二次拉伸
pixmap.setDevicePixelRatio(device_pixel_ratio)
pixmap.fill(QtCore.Qt.transparent)

# 字体配置,调用系统默认界面字体和原生渲染规则
font = QtGui.QFontDatabase.systemFont(QtGui.QFontDatabase.GeneralFont)
# 按逻辑尺寸设置字体大小
font.setPixelSize(int(tray_logic_height * 0.6))
font.setHintingPreference(QtGui.QFont.PreferFullHinting)

painter = QtGui.QPainter(pixmap)
# 开启高质量渲染配置
painter.setRenderHints(
    QtGui.QPainter.TextAntialiasing 
    | QtGui.QPainter.SmoothPixmapTransform
)
painter.setFont(font)
painter.setPen(QtGui.QColor("white"))
# 按逻辑矩形绘制文字
draw_rect = QtCore.QRect(0, 0, tray_logic_height * 2, tray_logic_height)
painter.drawText(draw_rect, QtCore.Qt.AlignVCenter, "Hello world!")
painter.end()

icon = QtGui.QIcon()
icon.addPixmap(pixmap)

可选优化

如果需要适配更多缩放场景,可以向QIcon中添加多组不同逻辑尺寸的Pixmap,Qt会自动选择最匹配当前显示场景的版本渲染,避免缩放模糊。

内容的提问来源于stack exchange,提问作者Blademaster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:45:01