PyQt 5.10 macOS高DPI支持开启后Pixmap画质问题求助
我之前也碰到过一模一样的问题——明明PyQt 5.10+宣称自动支持高DPI,但Retina屏上的Pixmap就是比Preview缩放的图模糊太多。给你几个亲测有效的解决步骤:
强制启用高DPI相关属性
虽然PyQt 5.10+默认应该开启高DPI缩放,但有时候系统环境或者启动顺序的问题会导致它没生效。在初始化QApplication之前,一定要加上这两行:from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication # 必须在QApplication实例化前设置 QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps) app = QApplication([])注意这两行必须在创建QApplication对象之前执行,不然完全没用。
提供Retina适配的2x资源
Mac的Retina屏是2倍像素密度,如果你只提供30x30的普通图,PyQt会把它拉伸到60x60来适配屏幕,自然会模糊。你需要准备一张60x60的图,命名为xxx@2x.png(比如原图标是icon.png,2x版本就是icon@2x.png),然后用QPixmap("icon.png")加载——PyQt会自动根据屏幕DPI选择对应的2x图,显示出来视觉尺寸是30x30,但像素是60x60,清晰度就和Preview一致了。配置Mac系统层面的高DPI支持
给你的应用添加Info.plist文件,里面加上NSHighResolutionCapable键并设置为true,让Mac系统明确知道这个应用支持Retina屏。如果是打包成.app的话,这个文件在Contents/Info.plist里;如果是开发阶段,可以通过PyInstaller等打包工具配置,或者手动添加:<key>NSHighResolutionCapable</key> <true/>使用平滑缩放(如果需要手动缩放Pixmap)
如果你需要手动缩放Pixmap,一定要用Qt.SmoothTransformation参数,避免锯齿和模糊:pixmap = QPixmap("icon.png") scaled_pixmap = pixmap.scaled(30, 30, Qt.KeepAspectRatio, Qt.SmoothTransformation)
这些步骤组合起来基本就能解决问题了——我当时就是把这几点都配置好之后,Pixmap的清晰度就和Preview里的完全一致了。
内容的提问来源于stack exchange,提问作者bhlee

