使用PyQt6时screeninfo包引发DPI感知错误
问题解决思路
一、替换screeninfo,用PyQt6原生API获取主显示器分辨率
直接用Qt自带的QGuiApplication和QScreen类获取主显示器信息,完全避免和screeninfo的冲突,代码如下:
from PyQt6.QtGui import QGuiApplication # 获取主屏幕 primary_screen = QGuiApplication.primaryScreen() # 获取屏幕的物理分辨率(不含DPI缩放的原始分辨率) screen_size = primary_screen.size() width = screen_size.width() height = screen_size.height() # 如果需要获取考虑系统DPI缩放后的逻辑分辨率,用这个: logical_size = primary_screen.logicalSize() logical_width = logical_size.width() logical_height = logical_size.height()
这样既拿到了主显示器的分辨率,又不会触发DPI权限错误,打包后也能正常运行。
二、解决Qt应用的DPI适配问题
Qt默认支持DPI感知,但要正确使用才能在不同分辨率下显示正常:
- 使用布局管理器:绝对定位(固定坐标、尺寸)会导致适配失效,必须用
QVBoxLayout、QHBoxLayout、QGridLayout等布局类,让UI元素自动根据窗口大小调整。 - 使用相对尺寸/比例:设置控件大小用百分比或基于屏幕尺寸的比例,比如按钮宽度设为屏幕宽度的1/10,而不是固定像素值。
- 设置字体的相对大小:用
QFont的setPointSizeF()或者基于屏幕DPI调整字体,避免字体在高分辨率屏幕上过小或过大。 - 启用高DPI缩放:在应用启动时显式设置DPI策略,确保Qt正确处理缩放:
from PyQt6.QtWidgets import QApplication from PyQt6.QtCore import Qt import sys if __name__ == "__main__": # 启用高DPI缩放支持 QApplication.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough) QApplication.setAttribute(Qt.ApplicationAttribute.AA_EnableHighDpiScaling) QApplication.setAttribute(Qt.ApplicationAttribute.AA_UseHighDpiPixmaps) app = QApplication(sys.argv) # 后续窗口初始化代码
三、修复PyInstaller打包后的DPI权限错误
如果还是遇到DPI相关的权限问题,可通过以下方式解决:
- 修改qt.conf配置文件:在打包时添加qt.conf,指定DPI感知模式,内容如下:
[Platforms] WindowsArguments = dpiawareness=0
将这个qt.conf和你的主脚本放在一起,PyInstaller打包时会自动包含(或通过--add-data参数指定)。这里dpiawareness=0表示使用系统默认的DPI感知,避免Qt尝试设置高权限的DPI模式导致访问被拒绝。
- PyInstaller打包参数优化:打包时添加
--windowed(如果是GUI应用),避免控制台输出干扰,同时确保所有Qt相关的依赖都被正确打包。
内容的提问来源于stack exchange,提问作者MasterOfDesaster42
相关产品推荐
相关产品推荐

