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

Windows 11下使用Poetry运行pytest时如何解决Qt的DpiAwarenessContext报错问题

Windows 11下使用Poetry运行pytest时如何解决Qt的DpiAwarenessContext报错问题

我完全理解你遇到这个问题的烦躁——明明团队里其他人都能正常跑的Qt相关测试,到你Windows 11上就因为DPI感知的权限问题卡壳,还不想每次都用管理员身份启动测试,太折腾人了。下面给你几个实际验证过的解决方案,你可以挨个试试:

  • 修正qt.conf的配置与放置位置
    你之前的qt.conf格式可能有问题,Qt对这个配置的格式要求很严格,正确的内容应该是:

    [Platforms]
    WindowsArguments = dpiawareness=0
    

    这里用0(系统DPI感知)比你之前写的0,1,2更明确,能避免Qt在多模式选择时出问题。另外,别只把这个文件放在你运行命令的临时目录,最好把它放在项目根目录或者测试脚本所在的mytests文件夹里,这样Poetry启动pytest时,测试进程能直接读取到这个配置。

  • 正确设置环境变量
    你之前的环境变量写法有问题,带引号的格式会让Poetry识别错误。试试在命令行里先设置环境变量再运行测试:
    如果是CMD命令行:

    set QT_QPA_PLATFORM=windows:dpiawareness=0
    poetry run pytest .\mytests\test1.py::test_performance
    

    如果是PowerShell:

    $env:QT_QPA_PLATFORM = "windows:dpiawareness=0"
    poetry run pytest .\mytests\test1.py::test_performance
    

    关键是要确保环境变量在Poetry启动pytest之前就设置好,这样虚拟环境里的测试进程才能继承到这个配置。

  • 在测试代码中直接强制设置DPI感知
    如果前面的配置方法都不管用,你可以在测试代码里直接调用Windows API绕过Qt的配置逻辑,普通用户权限就能执行。你可以在项目的conftest.py(所有测试都会加载的配置文件)里添加这段代码:

    import sys
    from ctypes import windll
    from PyQt6.QtCore import Qt
    from PyQt6.QtGui import QGuiApplication
    
    def setup_qt_dpi_awareness():
        if sys.platform != "win32":
            return
        # 先设置Qt的高DPI相关属性
        QGuiApplication.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
        QGuiApplication.setAttribute(Qt.ApplicationAttribute.AA_EnableHighDpiScaling)
        QGuiApplication.setAttribute(Qt.ApplicationAttribute.AA_UseHighDpiPixmaps)
        # 直接调用Windows API设置进程DPI感知为系统级
        windll.shcore.SetProcessDpiAwareness(0)
    
    # 在所有测试执行前初始化
    setup_qt_dpi_awareness()
    

    这段代码会在测试启动时直接强制设置DPI感知模式,跳过Qt自身的配置加载逻辑,能有效绕过权限问题。

  • 重置Poetry虚拟环境
    有时候虚拟环境的目录权限或者依赖缓存出问题,也会导致Qt读取配置失败。你可以试试:

    1. 关闭所有和Python、Poetry相关的进程
    2. 删除项目根目录下的.venv文件夹
    3. 重新运行poetry install创建全新的虚拟环境
    4. 再尝试启动测试

另外要明确告诉你:完全不需要每次都用管理员身份运行Qt应用,这个权限问题是Windows 11 DPI感知机制的一个小兼容性bug,不是Qt的硬性要求,上面的方法应该能帮你绕过这个问题。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 06:40:29