【发布时间】:2020-04-03 09:19:40
【问题描述】:
我正在开发一个使用许多小部件(QGroupBox、QVBoxLayout、QHBoxLayout)的应用程序。最初它是在普通高清显示器上开发的。但是,最近我们中的许多人升级到 4K 分辨率显示器。现在一些按钮和滑块被压缩得太小以至于无法使用。
现在我尝试进行一些更改,以便该应用程序可以同时用于高清和 4K 显示器。
我开始阅读下面的链接:
https://leomoon.com/journal/python/high-dpi-scaling-in-pyqt5/enter link description here
我认为每当我的窗口在特定监视器中打开时,我都可以调用以下代码:
if pixel_x > 1920 and pixel_y > 1080:
Qapp.setAttribute(Qt.AA_EnableHighDpiScaling, True)
Qapp.setAttribute(Qt.AA_UseHighDpiPixmaps, True)
else:
Qapp.setAttribute(Qt.AA_EnableHighDpiScaling, False)
Qapp.setAttribute(Qt.AA_UseHighDpiPixmaps, False)
然后我尝试使用以下代码从相关帖子here 获取显示器分辨率(pixel_x 和 pixel_y)。
import sys, ctypes
user32 = ctypes.windll.user32
user32.SetProcessDPIAware()
screen_width = 0 #78
screen_height = 1 #79
[pixel_x , pixel_y ] = [user32.GetSystemMetrics(screen_width), user32.GetSystemMetrics(screen_height)]
screen_width = 0, screen_height = 1 为我提供主显示器的分辨率(在我们的案例中主要是高清笔记本电脑)。 screen_width = 78, screen_height = 79 给了我虚拟机的组合分辨率。但我不明白如何根据应用程序打开的位置动态获取这些值。
我的应用程序窗口的开发方式是,它将在上次关闭的同一监视器中打开。现在的问题是,每当调用我的 GUI 并适应该分辨率时,我都想获得活动监视器分辨率。如果有人可以帮助我,我会很高兴。
我很想知道每次将窗口从高清显示器拖动到 4K 显示器时是否可以调用屏幕分辨率计算,反之亦然。
编辑:我在这篇文章here 中发现了类似的东西,但我不能从中得到太多。
Edit2:基于@Joe 解决方案,主屏幕检测,为什么我的主屏幕始终是笔记本电脑的分辨率,即使我在 4K 屏幕上运行应用程序?
我只是尝试使用以下代码获取所有屏幕的 dpi:
def screen_selection():
app = QApplication(sys.argv)
valid_screens = []
for index, screen_no in enumerate(app.screens()):
screen = app.screens()[index]
dpi = screen.physicalDotsPerInch()
valid_screens.append(dpi)
return valid_screens
【问题讨论】:
-
人们请看这篇文章,你稍后会感谢我:stackoverflow.com/questions/20243637/…
标签: python user-interface pyqt5 resolution pythoninterpreter