high - ¿Cambio de escala automático de una aplicación en la plataforma Windows de alto dpi?
high dpi archlinux (4)
Estoy escribiendo una aplicación Qt que necesita ejecutarse en Windows de alta dpi (192 ppp en lugar de 96 ppp).
Desafortunadamente, el marco Qt aún no tiene soporte para ppp altos (al menos en Windows), por lo que mi aplicación y todos sus elementos parecen tener la mitad del tamaño que deberían.
¿Hay alguna forma de forzar / simular la ampliación automática de dichas aplicaciones en Windows?
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 hace la escala, no Qt. Por lo tanto, la aparición 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 sino el más rápido para salir de problemas a corto plazo, lo que le permite desarrollar la versión "real" para el DPI sin presión.
Estoy usando Qt 4.8. En primer lugar, debe utilizar diseños. Mi objetivo era evitar que el usuario redimensionara los diálogos, formularios, etc. también.
Logré resultados de visualización correctos en diferentes DPI al poner este código en el constructor de diálogo:
adjustSize();
setFixedSize(size());
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 evita que los usuarios lo redimensionen. No tienes que establecer políticas de tamaño.
Las aplicaciones que utilizan coordenadas y tamaños fijos se verán reducidos en las resoluciones de alto DPI. Aunque incluso si se utilizan diseños, hay algunos problemas relacionados con los tamaños y márgenes de los elementos y fuentes. Afortunadamente, hay soporte para pantallas de alto DPI desde Qt 5.4 ya que ha habido muchas correcciones de problemas de alto DPI .
Una aplicación en Windows puede asumir uno de los siguientes niveles de "Reconocimiento de DPI" (De la documentación de Qt):
- DPI Sin darse cuenta: este nivel se ha introducido en Windows-Vista. Windows fingirá que la aplicación se está ejecutando en una pantalla estándar de 96 ppp de 1920x1080 y escalará la aplicación en consecuencia. Está diseñado para adaptarse a aplicaciones antiguas diseñadas para pantallas con bajo DPI. Algunos artefactos pueden resultar de este tipo de escala.
- System-DPI Aware: este nivel se ha introducido en Windows-Vista. Se diferencia 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 se establece que:
Las aplicaciones Qt de forma predeterminada 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 complemento de la plataforma (consulte Uso de qt.conf):
<application> -platform windows:dpiawareness=0,1,2
Puedes leer más información here .
En general, para tener una buena interfaz de usuario en pantallas de alto DPI, considere lo siguiente:
- Utiliza la última versión de Qt
- Use diseños y evite tamaños fijos (a menos que calcule las proporciones de escala por su cuenta)
- Realice la configuración apropiada relacionada con el DPI dependiendo de las necesidades de su aplicación, por ejemplo, establezca el atributo
Qt::AA_UseHighDpiPixmaps
si trabaja conQPainter
y pixmaps, o calcule una relación de escala para ajustar ciertos tamaños de elementos en situaciones especiales.
Qt es totalmente compatible con monitores de alto DPI desde Qt 5.6 en adelante, a través de un atributo o variable de entorno (excepto en OS X donde el soporte es nativo). Para el método del atributo, use:
#include <QApplication>
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
He probado ambos métodos en Windows 10 con un monitor de libro de superficie con un alto índice de DPI y los resultados se escalan correctamente como se esperaba.