2013-12-09 10 views
26

Ich habe eine GUI-Anwendung mit Qt erstellt. Meine GUI-Anwendung enthält Steuerelemente wie Drucktaste und Optionsfeld. Wenn ich die Anwendung, Schaltflächen und Schriftarten innerhalb der Schaltfläche ausführen, sieht normal aus. Wenn ich die DPI-Skalierungsgröße der Anzeige von 100% auf 150% oder 200% ändere, wird die Schriftgröße der Steuerelemente unabhängig von der Auflösung größer, aber nicht über die Steuergröße (Drucktaste, Optionsfeld) angezeigt. Aus diesem Grund wurde der Text in den Steuerelementen abgeschnitten. Bitte sehen Sie sich das beigefügte Bild an.Ändern der DPI-Skalierungsgröße der Anzeige, damit die Schriftgröße der Qt-Anwendung größer wird

Qt-Anwendung aussehen, wenn DPI-Skalierung Größe auf 100% gesetzt

Qt application look when DPI scaling size set to 100%

Qt-Anwendung aussehen, wenn DPI-Skalierung Größe auf 200% gesetzt

Qt application look when DPI scaling size set to 200%

ich meine Bewerbung leite in einige Tabletten auch. In Tabletten sollte der DPI-Skalierungswert mehr als 150% betragen, ansonsten wird alles sehr klein dargestellt.

Ich suchte im Internet für die Erstellung von UI-Anwendung in Qt unabhängig von Auflösung und DPI-Wert, aber kein Glück. Also poste ich meine Suche hier. Bitte lassen Sie mich wissen, ob es eine Möglichkeit gibt, dies zu beseitigen.

+0

i gleiche Problem haben, haben Sie eine Lösung dieses Problems in Bezug auf und mit Verwendung von qt5.6 Version , bitte helfen Sie mir – lucifer

Antwort

7

Die korrekte Verwendung von Layouts kann hilfreich sein.

http://qt-project.org/doc/qt-4.8/layout.html

Telling das Betriebssystem, die Sie behandeln DPI ändert, wird seltsame Schrift Änderungen verhindern, die Sie nicht erwartet hatten.

http://msdn.microsoft.com/en-us/library/ms701681(v=vs.85).aspx

Für kritische Orte Abstand, können Sie die Größe Ihrer gerenderte Schriftart überprüfen, und stellen Sie dann die Mindestgröße des Objekts auf der Basis der resultierenden Größe Ihres Textes.

http://qt-project.org/doc/qt-4.8/qfontmetrics.html#details

https://blog.qt.digia.com/blog/2009/06/26/improving-support-for-higher-dpi-on-vista/

Sie könnten versuchen, mit anderen in Messungen von Qt gebaut Überprüfung:

http://qt-project.org/doc/qt-4.8/qpaintdevice.html#widthMM

http://qt-project.org/doc/qt-4.8/qpaintdevice.html#logicalDpiX

Wenn Sie QML verwenden, versuchen Sie für unberührte Layouts von nur Anker basierend Platzierung.

http://qt-project.org/doc/qt-4.8/qml-anchor-layout.html

QApplication hat einige Einstellungen, die etwas verwandt sind.

http://qt-project.org/doc/qt-4.8/qapplication.html#setDesktopSettingsAware

Sie können manuell die Schriftart auch.

http://qt-project.org/doc/qt-4.8/qapplication.html#setFont

Hoffnung, das hilft.

+0

Der zweite von Ihnen zur Verfügung gestellte Link funktioniert nur in Windows oder? Ist es möglich, diese API in QT zu verwenden? Wird es in allen anderen Plattformen funktionieren? – impulse

+0

Ja, das ist ein Windows-spezifischer. Es kann ähnliche Dinge für andere Betriebssysteme geben, aber ich kenne sie nicht. – phyatt

+0

Solange Sie für Windows kompilieren, können Sie Windows API-Aufrufe verwenden. Die Verwendung von Windows-Aufrufen außerhalb von Windows wird nicht kompiliert. – phyatt

5

Ich hatte ein Fenster mit festgelegter Größe, das nicht groß genug war, um den gesamten darin enthaltenen Text zu enthalten, wenn Windows-Eingabehilfeneinstellungen zum Vergrößern aller Textgrößen verwendet wurden. Windows macht das via dpi erhöht. Ich habe das behoben, indem ich den OS-Skalierungsfaktor zurückgewählt und dann die Größe meines Fensters und einiger seiner Layouts angepasst habe (die ich aus irgendeinem Grund nicht automatisch skalieren konnte).

Hier ist, wie ich die dpi Skala bekam (in einer Datei namens "WindowsDpiScale.h"):

#ifndef WINDOWSDPISCALE_H 
#define WINDOWSDPISCALE_H 

#include <QtGlobal> 

#ifdef Q_OS_WIN 

#include <windows.h> 

const float DEFAULT_DPI = 96.0; 

float windowsDpiScale() 
{ 
    HDC screen = GetDC(0); 
    FLOAT dpiX = static_cast<FLOAT>(GetDeviceCaps(screen, LOGPIXELSX)); 
    ReleaseDC(0, screen); 
    return dpiX/DEFAULT_DPI; 
} 

#endif //Q_OS_WIN 

#endif // WINDOWSDPISCALE_H 

Und dann, wie ich wandte es in meinem Fall:

... 
#include "WindowsDpiScale.h" 

MainWindow::MainWindow(QWidget *parent) 
    : QMainWindow(parent) 
{ 
... 
    // Enlarge the window and various child widgets to accomendate 
    // OS display scaling (i.e. accessibily options) 
    setScaleToOsSettings(); 
... 
} 

void MainWindow::setScaleToOsSettings() 
{ 
#ifdef Q_OS_WIN 
    setScale(windowsDpiScale()); 
#endif 
} 

void MainWindow::setScale(float scale) 
{ 
    // Resize the window 
    this->setFixedSize((int)(scale * this->maximumWidth()), 
         (int)(scale * this->maximumHeight())); 

    // Resize the layouts within the stacked widget 
    foreach(QVBoxLayout * layout, 
      windowUi_->pagerStackedWidget->findChildren<QVBoxLayout *>()) 
     layout->parentWidget()->setFixedSize(
      (int)(scale * layout->parentWidget()->contentsRect().width()), 
      (int)(scale * layout->parentWidget()->contentsRect().height())); 
} 
+0

Ich habe das gleiche Problem, haben Sie eine Lösung in Bezug auf dieses Problem und ohne Verwendung von qt5.6 Version, bitte helfen Sie mir – lucifer

+0

Haben Sie meine Lösung versucht? Es ist nicht abhängig von der Qt-Version. Es erhält einfach den "Skalierungsfaktor" von Windows. Dann liegt es an Ihnen, die Größe Ihrer Widgets zu ändern - wie ich in meinem Beispiel zeige. – BuvinJ

+1

Arbeitet es auf Linux-Plattform? Ich benutze Qt auf Linux-Plattform. – lucifer

13

hohen DPI Die Unterstützung wird ab Qt 5.6 aktiviert.

Einstellung QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling) in Ihrer Anwendung Quellcode ermöglicht automatische High-DPI-Skalierung.

HINWEIS: das Attribut Methode verwenden, können Sie das Attribut festlegen müssen, bevor Sie Ihr QApplication-Objekt erstellen:

#include <QApplication> 

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

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

Ich habe das gleiche Problem, Sie haben eine Lösung in Bezug auf dieses Problem und mit der Verwendung von Qt5.6 Version, bitte helfen Sie mir – lucifer

+0

Danke für die Nachricht! – Stormenet

+0

Perfekte Antwort. – CroCo

Verwandte Themen