Estou trabalhando em um aplicativo que está usando muitos widgets (QGroupBox, QVBoxLayout, QHBoxLayout). Inicialmente, foi desenvolvido em monitores HD normais. Recentemente, porém, muitos de nós atualizamos para monitores de resolução 4K. Agora, alguns dos botões e controles deslizantes são compactados tão pequenos que são inutilizáveis.
Agora, tentei fazer algumas alterações para que o aplicativo pudesse ser usado com os monitores HD e 4K.
Comecei a ler o link abaixo:
https://leomoon.com/journal/python/high-dpi-scaling-in-pyqt5/ digite a descrição do link aqui
Eu pensei que sempre que minha janela é aberta em um monitor específico, eu posso chamar o seguinte código:
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)
Então tentei obter a resolução do monitor (pixel_x e pixel_y) usando o código abaixo usando post relacionado aqui .
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
fornece a resolução do meu monitor principal (na maioria dos casos, laptops que são HD). screen_width = 78, screen_height = 79
me dá a resolução combinada de máquinas virtuais. Mas não entendo como posso obter esses valores dinamicamente, dependendo de onde meu aplicativo foi aberto.
Minha janela do aplicativo é desenvolvida de tal maneira que será aberta no mesmo monitor em que foi fechada pela última vez. O problema agora é que quero obter a resolução do monitor ativo sempre que minha GUI for chamada e me adaptar a essa resolução. Eu ficaria feliz se alguém puder me ajudar.
Estou interessado em saber se posso chamar o cálculo da resolução da tela toda vez que arrasto minha janela de um monitor HD para um monitor 4K e vice-versa.
Edit: Eu encontrei algo semelhante neste post aqui, mas eu não poderia tirar muito disso.
Edit2: Com base na solução @ Joe, Detecção de tela primária, Por que minha tela principal é sempre a resolução do meu laptop, mesmo que eu execute o aplicativo em uma tela 4K?
Eu apenas tentei obter o dpi de todas as telas usando o código abaixo:
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