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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:34:51