Estoy trabajando en una aplicación que utiliza muchos widgets (QGroupBox, QVBoxLayout, QHBoxLayout). Inicialmente se desarrolló en monitores HD normales. Pero, recientemente, muchos de nosotros actualizamos a monitores de resolución 4K. Ahora, algunos de los botones y controles deslizantes están comprimidos tan pequeños que no se pueden usar.
Ahora intenté hacer algunos cambios para que la aplicación se pueda usar con monitores HD y 4K.
Empecé a leer el siguiente enlace:
https://leomoon.com/journal/python/high-dpi-scaling-in-pyqt5/ ingrese la descripción del enlace aquí
Pensé que cada vez que mi ventana se abre en un monitor en particular, puedo llamar al siguiente 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)
Luego traté de obtener la resolución del monitor (pixel_x y pixel_y) usando el código a continuación usando la publicación relacionada aquí .
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
me da la resolución de mi monitor primario (en su mayoría computadoras portátiles en nuestro caso que son HD). screen_width = 78, screen_height = 79
me da la resolución combinada de máquinas virtuales. Pero no entiendo cómo puedo obtener dinámicamente estos valores dependiendo de dónde se abrió mi aplicación.
La ventana de mi aplicación está desarrollada de tal manera que se abrirá en el mismo monitor donde se cerró la última vez. El problema ahora es que quiero obtener la resolución del monitor activo cada vez que se llama a mi GUI y adaptarme a esa resolución. Me alegraría si alguien me puede ayudar.
Me interesa saber si puedo llamar al cálculo de resolución de pantalla cada vez que arrastro mi ventana desde un monitor HD a un monitor 4K y viceversa.
Editar: he encontrado algo similar en esta publicación aquí, pero no pude obtener mucho de esto.
Edit2: Basado en la solución @Joe, Detección de pantalla primaria, ¿por qué mi pantalla principal siempre es la resolución de mi computadora portátil aunque ejecuto la aplicación en una pantalla 4K?
Solo traté de obtener el dpi de todas las pantallas usando el siguiente código:
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
fuente
QWidget
admiten este método, como puede ver aquí .QMainWindow
subclasesQWidget.
También probé mi código y funcionó. Por favor, comprueba si también funciona para ti.QMainWindow
y sobrecargar elmoveEvent
. Esto funciona al 100% y proporciona más funcionalidad para usted. Puede tomar el código que le proporcioné y usarlo. El código funciona bien y obtengo lascreenChanged
señal correcta cada vez que muevo la `` Ventana principal '' en otra pantalla.PyQt5
versión es 5.13.2 Puede ver aquí que la referencia oficial de PyQt5 también enumera elQApplication.screenAt
método.Una de las soluciones que llegué a través de es utilizar un temporal
QApplication()
:Esta función detectará todas las pantallas adjuntas:
Puede usar las sugerencias aquí y aquí para obtener la pantalla donde se ejecuta la aplicación.
Pero creo
primaryScreen
que también debería devolver esto:( https://doc.qt.io/qt-5/qguiapplication.html#primaryScreen-prop )
fuente
app.primaryScreen()
para ver qué pantalla se utiliza.Aunque no pude obtener la solución directa, puedo desarrollar un método para obtener lo que estaba buscando. Con la ayuda de unos pocos enlaces y una publicación anterior, puedo lograrlo. con esta publicación tuve la idea de rastrear el evento del mouse.
Desarrollé un método para rastrear todos los monitores y las respectivas posiciones de mira. si mi nombre variable no es apropiado, me complace aceptar los cambios
Con las dos funciones anteriores, puedo rastrear la posición de mi aplicación (ventana) y también puedo rastrear cuando se arrastra entre ventanas
fuente