2014-06-23 11 views
15

Ich schreibe eine Qt-Anwendung, die auf High-dpi-Windows (192dpi statt 96dpi) ausgeführt werden muss.Automatische Neuskalierung einer Anwendung auf einer Windows-Plattform mit hoher dpi-Auflösung?

Leider hat das Qt-Framework noch keine Unterstützung für High-dpi (zumindest unter Windows), so dass meine Anwendung und alle ihre Elemente halb so groß aussehen, wie es sollte.

Gibt es eine Möglichkeit, das automatische Upscaling solcher Apps durch Windows zu erzwingen/simulieren?

Antwort

6

Anwendungen, die feste Koordinaten und Größen verwenden, sehen bei Auflösungen mit hoher DPI klein aus. Auch wenn Layouts verwendet werden, gibt es einige Probleme bezüglich Element- und Schriftgrößen und -rändern. Glücklicherweise gibt es seit Qt 5.4 Unterstützung für High-DPI-Displays, da es viele high-DPI issue fixes gab.

Eine Anwendung auf Windows kann eine der folgenden Stufen von "DPI-Bewusstsein" (Aus der Qt-Dokumentation) übernehmen:

  • DPI Unaware: Dieses Niveau wird in Windows-Vista eingeführt. Windows wird der Anwendung vorgeben, dass es auf einer Standardanzeige von 96 DPI von 1920x1080 ausgeführt wird, und skaliert die Anwendung entsprechend. Es ist vorgesehen, ältere Anwendungen, die für Anzeigen mit niedrigem DPI ausgelegt sind, mit zu versehen. Einige Artefakte können durch diese Art der Skalierung entstehen.
  • System-DPI Aware: Dieses Level wurde in Windows-Vista eingeführt. Es unterscheidet sich von Per-Monitor DPI Aware nur dann, wenn mehrere Monitore mit verbunden sind. Windows berechnet eine Skalierung, die für alle verbundenen Monitore geeignet ist.
  • Pro-Monitor DPI Aware: Dieser Level wurde in Windows 8.1 eingeführt. Windows führt überhaupt keine Skalierung durch.

Auch heißt es, dass:

Qt-Anwendungen standardmäßig sind Per-Monitor-DPI Aware auf Windows 8.1 oder -System-DPI Aware auf ältere Versionen von Windows. Ab Qt 5.4, kann der Pegel, indem ein Parameter auf der Plattform Plugin angegeben werden (siehe Mit qt.conf):

<application> -platform windows:dpiawareness=0,1,2 

Sie here weitere Informationen lesen kann.

Im Allgemeinen ein gutes UI auf High-DPI-Displays haben, sollten Sie Folgendes beachten:

  • Verwenden Sie die neueste Version von Qt
  • Verwenden von Layouts und feste Größen vermeiden (es sei denn, Sie Skalierungsverhältnisse berechnen auf Eigene)
  • Nehmen Sie die entsprechenden DPI-Einstellungen abhängig von Ihren Anwendungsanforderungen vor, z. B. Qt::AA_UseHighDpiPixmaps Attribut, wenn Sie mit QPainter und Pixmaps arbeiten, oder berechnen Sie ein Skalierungsverhältnis für die Anpassung bestimmter Elementgrößen in besonderen Situationen.
6

Qt unterstützt volle DPI-Monitore ab Qt 5.Ab 6, über Attribut oder Umgebungsvariable (außer auf OS X, wo die Unterstützung nativ ist). Für das Attribut Verfahren, Verwendung:

#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // DPI support 

    QApplication app(argc, argv); 
    return app.exec(); 
} 

oder die Systemumgebungsvariable:

QT_AUTO_SCREEN_SCALE_FACTOR=1 

ich beide Methoden auf Windows getestet haben 10 mit einem High-DPI surfacebook Monitor und die Ergebnisse werden skaliert richtig wie erwartet.

0

Ich verwende Qt 4.8. Zuerst sollten Sie Layouts verwenden. Mein Ziel war es, zu verhindern, dass Benutzer die Größe von Dialogen, Formularen usw. ändern.

I korrekte Anzeige Ergebnisse auf verschiedenen DPI von Put diesen Code im Dialog Konstruktor erreicht:

adjustSize(); 
setFixedSize(size()); 

Erste Zeile adjustSize() Größe des Dialogs anpassen seinen Inhalt passen. Die zweite Zeile setFixedSize(size()) legt die Größe des Dialogfelds fest, nachdem die Größe des Inhalts angepasst wurde und verhindert wird, dass Benutzer die Größe ändern. Sie müssen keine Größenrichtlinien festlegen.