Screeninfo 包导致使用 PyQt6 时出现 DPI 感知错误

问题描述 投票:0回答:1

我正在尝试确定 PyQt6 应用程序中主显示器的分辨率。不幸的是,这会导致以下错误:
qt.qpa.window:SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)失败:COM错误0x5:访问被拒绝。

Qt 的默认 DPI 感知上下文是 DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2。如果您知道自己在做什么,则可以使用 qt.conf 覆盖此默认值(https://doc.qt.io/qt-6/highdpi.html#configuring-windows

虽然此错误仅出现两次,但在 VS Code 中启动应用程序时,当将应用程序作为使用 pyinstaller 创建的独立可执行文件运行时,错误会无限出现,导致应用程序循环。这甚至导致 Windows 操作系统疯狂滞后。最重要的是,Windows 无法关闭该应用程序,甚至无法通过任务管理器关闭。最后我只能通过电源按钮强制关机。

我知道是 screeninfo 包导致了错误,因为删除它可以消除错误。但是,我需要使用 screeninfo 来确定主显示器的分辨率,如下所示:

from screeninfo import get_monitors

monitors = get_monitors()
for monitor in monitors:
    if monitor.is_primary:
        primary_monitor = monitor
        break

我需要分辨率来设置 UI 元素的大小,以在每台计算机上占用相同的相对空间。

顺便说一句,Qt 文档表示它默认支持 DPI 感知缩放。但是,当不使用相对大小时,我的应用程序在不同分辨率的显示器上看起来会有所不同。那么,这应该如何运作?

这是我用 python 构建的第一个完整的应用程序,所以我基本上不知道我在做什么..

python scaling dpi pyqt6
1个回答
0
投票

不确定我的答案是否好,如果您想将屏幕宽度和高度传递给方法,您需要从活动的 QApplication 获取屏幕像素大小。不然不行。

from PySide6.QtWidgets import QApplication

app = QApplication(sys.argv)
print(f"Width: {app.primaryScreen().size().width()}")
print(f"Height: {app.primaryScreen().size().height()}")

但是,如果你还想尝试,可以直接传递

QApplication().primaryScreen()...
,而不是对象。但是调用 QApplication() 将创建新的 QApplication 对象。如果您已经有一个,我认为这不是一个好主意。

如果此解决方法可以解决您的问题,请将其标记为答案。

© www.soinside.com 2019 - 2024. All rights reserved.