我正在尝试确定 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
app = QApplication(sys.argv)
print(f"Width: {app.primaryScreen().size().width()}")
print(f"Height: {app.primaryScreen().size().height()}")
但是,如果你还想尝试,可以直接传递
QApplication().primaryScreen()...
,而不是对象。但是调用 QApplication() 将创建新的 QApplication 对象。如果您已经有一个,我认为这不是一个好主意。
如果此解决方法可以解决您的问题,请将其标记为答案。