提问人:MasterOfDesaster42 提问时间:9/26/2023 更新时间:11/3/2023 访问量:182
Screeninfo 包使用 PyQt6 导致 DPI 感知错误
Screeninfo Package causes DPI Awareness Error using PyQt6
问:
我正在尝试确定 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构建的完整应用程序,所以我基本上不知道我在做什么。
答:
如果要将屏幕宽度和高度传递给方法,则需要从活动 .否则,它将无法正常工作。QApplication
from PySide6.QtWidgets import QApplication
import sys
app = QApplication(sys.argv)
print(f"Width: {app.primaryScreen().size().width()}")
print(f"Height: {app.primaryScreen().size().height()}")
但是,如果还是想尝试,可以直接传递而不是对象。但是,调用会创建一个新对象(如果你已经有一个对象,我认为这不是一个好主意)。QApplication().primaryScreen()...
QApplication()
QApplication
评论
QApplication.screens()