Modification de la taille de mise à l'échelle du DPI de l'affichage de la taille de police de L'application Qt obtenir rendu plus grand

j'ai créé une application GUI en utilisant Qt. Mon application GUI contient des commandes comme bouton-poussoir et bouton-radio. Quand j'exécute l'application, les boutons et les polices de caractères à l'intérieur du bouton semble normal. Lorsque je change la taille de mise à l'échelle DPI de l'affichage de 100% à 150% ou 200%, la taille de police des contrôles rendus plus grand mais pas la taille de contrôle (bouton-poussoir, bouton radio) quelle que soit la résolution. Pour cette raison, le texte à l'intérieur de contrôles ont été coupées. veuillez voir l'image jointe.

Qt application Regarder lorsque la taille de mise à l'échelle DPI est fixée à 100%

Qt application look when DPI scaling size set to 100%

application Qt regarder quand DPI taille fixée à 200%

Qt application look when DPI scaling size set to 200%

j'exécute mon application dans quelques comprimés aussi. Dans les tablettes, la valeur de L'échelle DPI doit être plus de 150% sinon tout sera affiché très petit.

j'ai cherché dans le web pour créer une application D'interface utilisateur dans Qt sans tenir compte de la résolution et de la valeur D'échelle de DPI, mais pas de chance. Donc je suis poster mes quêtes ici. Dites-moi s'il y a un moyen de s'en débarrasser.

28
demandé sur Mat 2013-12-09 10:52:04

3 réponses

le support DPI élevé est activé à partir de Qt 5.6.

QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling) dans votre application, le code source permet une mise à l'échelle automatique en DPI élevé.

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

#include <QApplication>

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

    QApplication app(argc, argv);   
    return app.exec();
}
17
répondu Nicolas Holthaus 2018-06-07 13:43:56

utiliser correctement les layouts peut aider.

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

dire au système D'exploitation que vous gérez les changements de DPI empêchera les changements de police bizarres auxquels vous ne vous attendiez pas.

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

pour espacer les endroits critiques, vous pouvez vérifier la taille de votre police rendue, puis définir la taille minimale de votre objet en fonction du résultat la taille 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 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 d'obtenir des mises en page vierges du seul placement basé sur l'ancrage.

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

QApplication a certains paramètres qui sont un peu concerner.

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

Vous pouvez aussi spécifier manuellement la police.

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

J'espère que ça aidera.

7
répondu phyatt 2013-12-09 07:21:51

j'avais une fenêtre de taille fixe qui n'était pas assez grande pour correspondre à tout le texte qu'elle contenait lorsque les paramètres d'accessibilité de Windows ont été appliqués pour augmenter toutes les tailles de texte. Windows le fait via les augmentations de dpi. J'ai corrigé cela en retirant le facteur d'échelle de l'os et j'ai ensuite ajusté la taille de ma fenêtre et certaines de ses mises en page (que je ne pouvais pas mettre à l'échelle automatiquement pour une raison quelconque).

Voici comment j'ai obtenu l'échelle de 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
...
#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
répondu BuvinJ 2015-04-02 16:15:29