Changing DPI scaling size of display make Qt application's font size get rendered bigger

前端 未结 5 1102
滥情空心
滥情空心 2020-12-02 10:20

I have created some GUI application using Qt. My GUI application contains controls like push button and radio button. When I run the application, buttons and fonts inside bu

相关标签:
5条回答
  • 2020-12-02 11:00

    There are several options when dealing with high-resolution displays:

    1. Do nothing and develop in high resolution. Eventually, a higher resolution becomes a new standard, everybody will get 13-15-17 inches. It did work in the 2000th, didn't it?
    2. Leave it to the OS. For example, Windows has a special compatibility setting which scales everything to correct size, while keeping the application think that it renders of a low-resolution display. This is called DPI Unaware on Windows.
    3. Try to use Qt capabilities, QT_AUTO_SCREEN_SCALE_FACTOR=0, QT_SCALE_FACTOR=1.
    4. Use a little bit of help from Qt by setting QT_AUTO_SCREEN_SCALE_FACTOR to 1 or a correspondent AA_EnableHighDpiScaling attribute (introduced in Qt 5.6). This will scale widget sizes relative to the font size, so you only need to deal with raster images.
    5. Turn off AA_EnableHighDpiScaling and rethink all your pixel sizes by making them relative to the font size or multiplying them over the device pixel ratio.
    6. An improvement over a previous step: take into an account the device pixel ratio on every display, so that UI is scaled appropriately when you move it to another display.

    Sources:

    • https://doc.qt.io/qt-5/scalability.html
    • https://doc.qt.io/qt-5/highdpi.html
    • https://docs.microsoft.com/en-us/windows/win32/hidpi/high-dpi-desktop-application-development-on-windows
    0 讨论(0)
  • 2020-12-02 11:07

    High DPI support is enabled from Qt 5.6 onward.

    Setting QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling) in your application source code allows automatic high-DPI scaling.

    NOTICE: To use the attribute method, you must set the attribute before you create your QApplication object:

    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    
        QApplication app(argc, argv);   
        return app.exec();
    }
    
    0 讨论(0)
  • 2020-12-02 11:13

    Its a workaround.Create a file "qt.conf" . Add these lines to it.

    [Platforms]

    WindowsArguments = dpiawareness=0

    Put this file in the application binary folder.That's all . It will work well but only issue is that the look will not be that crisp. For delivering it to the customer, add this file where you have your dependency files & while creating setup, like normally you run your dependency files , run this same as well.

    0 讨论(0)
  • 2020-12-02 11:16

    I had a fixed size window which was not large enough to fit all the text it contained when Windows accessibility settings where applied to scale up all text sizes. Windows does this via dpi increases. I fixed this by retreiving the os scaling factor and then adjusted the size of the my window and some of it's layouts (which I couldn't get to scale automatically for some reason).

    Here's how I got the dpi scale (in a file called "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
    

    And then, how I applied it in my case:

    ...
    #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 讨论(0)
  • 2020-12-02 11:18

    Using layouts correctly can help.

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

    Telling the OS that you handle DPI changes, will prevent weird font changes that you weren't expecting.

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

    For spacing critical places, you can check the size of your rendered font, and then set the minimum size of your object based on the resulting size of your text.

    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/

    You could try checking with other built in measurements from Qt:

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

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

    If you are using QML, try for pristine layouts of only anchor based placement.

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

    QApplication has some settings that are somewhat related.

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

    You could manually specify the font, too.

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

    Hope that helps.

    0 讨论(0)
提交回复
热议问题