Escalado automático de una aplicación en una plataforma Windows de alta resolución?

Estoy escribiendo una aplicación Qt que necesita ejecutarse en Windows de alta resolución (192 ppp en lugar de 96 ppp).

Lamentablemente, el marco Qt aún no admite LDP alta (al menos en Windows), por lo que mi aplicación y todos sus elementos tienen la mitad del tamaño que debería.

¿Hay alguna manera de forzar / simular el aumento automático de dichas aplicaciones por parte de Windows?

Las aplicaciones que usan coordenadas y tamaños fijos se verán pequeñas en resoluciones de alta resolución. Aunque incluso si se utilizan diseños, existen algunos problemas relacionados con los tamaños y márgenes de los elementos y las fonts. Afortunadamente, hay soporte para pantallas de alta resolución desde Qt 5.4 ya que ha habido muchas reparaciones de problemas de alta resolución .

Una aplicación en Windows puede asumir uno de los siguientes niveles de “Conciencia DPI” (De la documentación de Qt):

  • DPI sin conocimiento: este nivel se ha introducido en Windows Vista. Windows simulará que la aplicación se está ejecutando en una pantalla estándar de 96 DPI de 1920×1080 y escalará la aplicación en consecuencia. Está diseñado para acomodar aplicaciones antiguas diseñadas para pantallas de bajo DPI. Algunos artefactos pueden ser el resultado de este tipo de escalado.
  • Sistema-DPI Aware: este nivel se ha introducido en Windows-Vista. Difiere de Per-Monitor DPI Aware solo cuando hay varios monitores conectados. Windows calculará una escala adecuada para todos los monitores conectados.
  • Per-Monitor DPI Aware: este nivel se ha introducido en Windows 8.1. Windows no realiza ninguna escala en absoluto.

También dice que:

Las aplicaciones Qt por defecto son Per-Monitor DPI Aware en Windows 8.1 o System-DPI Aware en versiones anteriores de Windows. A partir de Qt 5.4, el nivel puede especificarse pasando un parámetro al plugin de la plataforma (ver Uso de qt.conf):

 -platform windows:dpiawareness=0,1,2 

Puedes leer más información aquí .

En general, para tener una buena interfaz de usuario en pantallas de alta resolución, tenga en cuenta lo siguiente:

  • Use la última versión de Qt
  • Utilice diseños y evite tamaños fijos (a menos que calcule proporciones de escala por su cuenta)
  • Establezca las configuraciones apropiadas relacionadas con DPI en función de las necesidades de su aplicación, por ejemplo, establezca el atributo Qt::AA_UseHighDpiPixmaps si trabaja con QPainter y pixmaps, o calcule una proporción de escala para ajustar ciertos tamaños de elementos en situaciones especiales.

Qt es totalmente compatible con monitores de PPP altos desde Qt 5.6 en adelante, a través de variables de atributo o de entorno (excepto en OS X donde el soporte es nativo). Para el método de atributo, use:

 #include  int main(int argc, char *argv[]) { QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // DPI support QApplication app(argc, argv); return app.exec(); } 

o establecer la variable de entorno del sistema:

 QT_AUTO_SCREEN_SCALE_FACTOR=1 

Probé ambos métodos en Windows 10 con un monitor de alto contenido de DPI y los resultados se escalan correctamente como se esperaba.

Esta es la forma más rápida de resolver el problema en Windows.

Junto al ejecutable, cree un archivo qt.conf (si no está ya allí) y agregue lo siguiente:

 [Platforms] WindowsArguments = dpiawareness=0 

La ventana aparecerá borrosa cuando se amplíe. La gran ventaja de esta solución es que Windows escala, no Qt. Por lo tanto, la ocurrencia de artefactos se minimiza. Además, esto puede aplicarse a una aplicación ya distribuida ya que no requiere una reconstrucción.

Por supuesto, este no es el resultado más placentero, pero lo más rápido es sacarlo de problemas a corto plazo, permitiéndole desarrollar la versión “real” de PPP sin presión.

Estoy usando Qt 4.8. Primero, debes usar diseños. Mi objective era evitar que el usuario cambie el tamaño de los cuadros de diálogo, formularios, etc.

Logré los resultados de visualización correctos en diferentes DPI poniendo este código en el constructor del diálogo:

 adjustSize(); setFixedSize(size()); 

La primera línea adjustSize() ajusta el tamaño del diálogo para que se ajuste a su contenido. La segunda línea setFixedSize(size()) corrige el tamaño del diálogo después de ajustar su tamaño al contenido y evitar que los usuarios lo cambien de tamaño. No tiene que establecer políticas de tamaño.