Riscalare automaticamente un’applicazione su una piattaforma Windows ad alta risoluzione?

Sto scrivendo un’applicazione Qt che deve essere eseguita su Windows ad alta risoluzione (192 dpi anziché 96 dpi).

Sfortunatamente il framework Qt non ha ancora il supporto per l’alta risoluzione (almeno su Windows), quindi la mia applicazione e tutti i suoi elementi sembrano la metà delle dimensioni che dovrebbero.

C’è un modo per forzare / simulare l’upscaling automatico di tali app da parte di Windows?

Le applicazioni che utilizzano coordinate e dimensioni fisse appariranno piccole su risoluzioni DPI elevate. Sebbene anche utilizzando i layout ci siano alcuni problemi relativi alle dimensioni e ai margini di elementi e font. Fortunatamente esiste il supporto per i display ad alta DPI da Qt 5.4 in quanto vi sono state molte correzioni di problemi con DPI elevati .

Un’applicazione su Windows può assumere uno dei seguenti livelli di “Awareness DPI” (Dalla documentazione Qt):

  • DPI inconsapevole: questo livello è stato introdotto in Windows Vista. Windows farà finta all’applicazione che è in esecuzione su un display standard di 96 DPI di 1920×1080 e ridimensiona l’applicazione di conseguenza. È progettato per ospitare applicazioni precedenti progettate per display a basso DPI. Alcuni artefatti possono derivare da questo tipo di ridimensionamento.
  • System-DPI Aware: questo livello è stato introdotto in Windows-Vista. Si differenzia da DPI-Per-Monitor Aware solo quando sono collegati più monitor. Windows calcolerà un ridimensionamento adatto a tutti i monitor connessi.
  • Per-Monitor DPI Aware: questo livello è stato introdotto in Windows 8.1. Windows non esegue alcun ridimensionamento.

Inoltre afferma che:

Le applicazioni Qt per impostazione predefinita sono DPI DPI Per-Monitor su Windows 8.1 o System-DPI Aware su versioni precedenti di Windows. A partire da Qt 5.4, il livello può essere specificato passando un parametro al plug-in della piattaforma (consultare Uso di qt.conf):

 -platform windows:dpiawareness=0,1,2 

Puoi leggere maggiori informazioni qui .

In generale, per avere una buona interfaccia utente su display a DPI elevato, considerare quanto segue:

  • Utilizzare l’ultima versione di Qt
  • Usa i layout ed evita le dimensioni fisse (a meno che tu non calcoli i rapporti di ridimensionamento da solo)
  • Qt::AA_UseHighDpiPixmaps impostazioni appropriate DPI in base alle esigenze dell’applicazione, ad esempio impostare l’attributo Qt::AA_UseHighDpiPixmaps se si lavora con QPainter e pixmaps o calcolare un rapporto di ridimensionamento per regolare determinate dimensioni di elemento in situazioni speciali.

Qt supporta pienamente i monitor DPI alti da Qt 5.6 in poi, tramite attributo o variabile di ambiente (eccetto su OS X dove il supporto è nativo). Per il metodo dell’attributo, utilizzare:

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

o impostare la variabile di ambiente di sistema:

 QT_AUTO_SCREEN_SCALE_FACTOR=1 

Ho testato entrambi i metodi su Windows 10 con un monitor di cartone ad alta risoluzione e i risultati sono stati ridimensionati correttamente come previsto.

Ecco il modo più rapido per risolvere il problema su Windows.

Accanto all’eseguibile, crea un file qt.conf (se non c’è già) e aggiungi quanto segue:

 [Platforms] WindowsArguments = dpiawareness=0 

La finestra apparirà sfocata quando ingrandita. Il grande vantaggio di questa soluzione è che Windows esegue il ridimensionamento, non Qt. Pertanto, la presenza di artefatti è ridotta al minimo. Inoltre, questo può essere applicato a un’app già distribuita in quanto non richiede una ricostruzione.

Naturalmente, questo non è il risultato più piacevole, ma il più veloce per tirarti fuori dai guai a breve termine, permettendoti di sviluppare la versione “reale” in grado di DPI senza pressioni.

Sto usando Qt 4.8. Innanzitutto, dovresti usare i layout. Il mio objective era quello di impedire all’utente di ridimensionare dialoghi, moduli, ecc.

Ho raggiunto risultati di visualizzazione corretti su DPI diversi inserendo questo codice nel costruttore di windows di dialogo:

 adjustSize(); setFixedSize(size()); 

First line adjustSize() regola la dimensione della finestra di dialogo per adattarla al suo contenuto. La seconda riga setFixedSize(size()) corregge le dimensioni della finestra di dialogo dopo aver regolato la sua dimensione sul contenuto e impedito agli utenti di ridimensionarla. Non devi impostare criteri per le dimensioni.