gpt4 book ai didi

python - 如何使用 python PyQt5 确定我的应用程序(窗口)的事件屏幕(监视器)?

转载 作者:行者123 更新时间:2023-12-02 02:51:20 26 4
gpt4 key购买 nike

我正在开发一个使用许多小部件(QGroupBox、QVBoxLayout、QHBoxLayout)的应用程序。最初它是在普通高清显示器上开发的。但是,最近我们中的许多人都升级到了 4K 分辨率显示器。现在,一些按钮和 slider 被压缩得太小,以至于无法使用。

现在我尝试进行一些更改,以便该应用程序可以在高清和 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但我并没有从中得到什么。

编辑2:基于@Joe解决方案,主屏幕检测,为什么我的主屏幕始终是我的笔记本电脑分辨率,即使我在4K屏幕上运行应用程序? enter image description here

我只是尝试使用下面的代码获取所有屏幕的 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

最佳答案

我来了一个解决方案across是使用临时的QApplication():

import sys
from PyQt5 import QtWidgets, QtCore, QtGui

# fire up a temporary QApplication
def get_resolution():

app = QtWidgets.QApplication(sys.argv)

print(app.primaryScreen())

d = app.desktop()

print(d.screenGeometry())
print(d.availableGeometry())
print(d.screenCount())

g = d.screenGeometry()
return (g.width(), g.height())

x, y = get_resolution()

if x > 1920 and y > 1080:
QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, True)
QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps, True)
else:
QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, False)
QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps, False)

# Now your code ...

此函数将检测所有连接的屏幕:

# fire up a temporary QApplication
def get_resolution_multiple_screens():

app = QtGui.QGuiApplication(sys.argv)
#QtWidgets.QtGui
all_screens = app.screens()

for s in all_screens:

print()
print(s.name())
print(s.availableGeometry())
print(s.availableGeometry().width())
print(s.availableGeometry().height())
print(s.size())
print(s.size().width())
print(s.size().height())

print()
print('primary:', app.primaryScreen())
print('primary:', app.primaryScreen().availableGeometry().width())
print('primary:', app.primaryScreen().availableGeometry().height())

# now choose one

您可以使用提示herehere获取应用程序正在运行的屏幕。

但我认为 primaryScreen 也应该返回这个:

primaryScreen : QScreen* const

This property holds the primary (or default) screen of the application.

This will be the screen where QWindows are initially shown, unless otherwise specified.

( https://doc.qt.io/qt-5/qguiapplication.html#primaryScreen-prop )

关于python - 如何使用 python PyQt5 确定我的应用程序(窗口)的事件屏幕(监视器)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59262975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com