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
fonte
QWidget
suportam esse método, como você pode ver aqui .QMainWindow
subclassesQWidget.
Também testei meu código e funcionou. Por favor, verifique se ele também funciona para você.QMainWindow
e sobrecarga damoveEvent
. Isso funciona 100% e fornece mais funcionalidade para você. Você pode simplesmente pegar o código que eu forneci e usá-lo. O trecho de código funciona bem e eu recebo oscreenChanged
sinal correto sempre que movo o `` MainWindow` para outra tela.PyQt5
versão é 5.13.2 Você pode ver aqui que a referência oficial do PyQt5 também lista oQApplication.screenAt
método.Uma solução que me deparei é usar um temporário
QApplication()
:Esta função detectará todas as telas anexadas:
Você pode usar as dicas aqui e aqui para obter a tela em que o aplicativo está sendo executado.
Mas acho
primaryScreen
que também deve retornar isso:( https://doc.qt.io/qt-5/qguiapplication.html#primaryScreen-prop )
fonte
app.primaryScreen()
para ver qual tela é usada.Embora eu não tenha conseguido a solução direta, sou capaz de desenvolver um método para obter o que estava procurando. Com a ajuda de alguns links e post anterior eu sou capaz de alcançar. com este post , tive uma ideia de acompanhar o evento do mouse.
Eu desenvolvi um método para rastrear todos os monitores e respectivas posições de observação. se minha nomeação de variável não for apropriada, fico feliz em aceitar as alterações
Com o aboe, duas funções são capazes de rastrear a posição do meu aplicativo (janela) e também de rastrear quando ele é arrastado pelas janelas
fonte