HiDPI屏幕下QPainter.drawText绘制系统托盘文字模糊如何解决
核心原因:
- 未给QPixmap设置匹配HiDPI的设备像素比,Qt渲染时会将高分辨率图源当成普通分辨率图源拉伸,导致模糊
- 手动设置字体拉伸参数破坏了字体原生hinting规则,额外降低了文字清晰度
修改方案
- 保留你原有上下文代码中HiDPI相关属性的设置,注意这两行必须放在QApplication实例化之前,顺序不要改
- 图标生成逻辑按以下代码调整:
# 先获取当前设备的像素比 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
相关产品推荐
相关产品推荐

