web-dev-qa-db-fra.com

La modification de la taille de mise à l'échelle DPI de l'affichage augmente la taille de la police de l'application Qt

J'ai créé une application graphique en utilisant Qt. Mon application GUI contient des contrôles comme bouton poussoir et bouton radio. Lorsque j'exécute l'application, les boutons et les polices à l'intérieur du bouton semblent normaux. Lorsque je modifie la taille de mise à l'échelle DPI de l'affichage de 100% à 150% ou 200%, la taille de la police des contrôles est agrandie mais pas la taille du contrôle (bouton-poussoir, bouton radio) quelle que soit la résolution. Pour cette raison, le texte à l'intérieur des commandes a été coupé. veuillez voir l'image ci-jointe.

Application Qt lorsque la taille de mise à l'échelle DPI est définie sur 100%

Qt application look when DPI scaling size set to 100%

Application Qt lorsque la taille de mise à l'échelle DPI est définie sur 200%

Qt application look when DPI scaling size set to 200%

J'exécute également mon application sur certaines tablettes. Dans les tablettes, la valeur de l'échelle DPI doit être supérieure à 150%, sinon tout sera très petit.

J'ai cherché sur le Web pour créer une application d'interface utilisateur dans Qt indépendamment de la résolution et de la valeur d'échelle DPI, mais pas de chance. Je poste donc ma quête ici. Veuillez me faire savoir s'il existe un moyen de s'en débarrasser.

32
Arun

Le support High DPI est activé à partir de Qt 5.6.

La définition de QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling) dans le code source de votre application permet une mise à l'échelle automatique à haute résolution.

AVIS: pour utiliser la méthode d'attribut, vous devez définir l'attribut avant de créer votre objet QApplication:

#include <QApplication>

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

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

L'utilisation correcte des mises en page peut vous aider.

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

Dire au système d'exploitation que vous gérez les modifications DPI empêchera les changements de police étranges auxquels vous ne vous attendiez pas.

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

Pour l'espacement des endroits critiques, vous pouvez vérifier la taille de votre police rendue, puis définir la taille minimale de votre objet en fonction de la taille résultante de votre texte.

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/

Vous pouvez essayer de vérifier avec d'autres mesures intégrées de Qt:

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

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

Si vous utilisez QML, essayez des mises en page vierges avec uniquement un placement basé sur les ancres.

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

QApplication a des paramètres quelque peu liés.

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

Vous pouvez également spécifier manuellement la police.

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

J'espère que ça t'as aidé.

9
phyatt

J'avais une fenêtre de taille fixe qui n'était pas assez grande pour contenir tout le texte qu'elle contenait lorsque les paramètres d'accessibilité de Windows étaient appliqués pour augmenter toutes les tailles de texte. Windows le fait via dpi augmente. J'ai corrigé cela en récupérant le facteur de mise à l'échelle du système d'exploitation, puis ajusté la taille de ma fenêtre et certaines de ses dispositions (que je n'ai pas pu mettre à l'échelle automatiquement pour une raison quelconque).

Voici comment j'ai obtenu l'échelle dpi (dans un fichier appelé "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

Et puis, comment je l'ai appliqué dans mon cas:

...
#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()) );
}
5
BuvinJ