Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Automatic rescaling of an application on high-dpi Windows platform?

Tags:

I'm writing a Qt application that needs to run on high-dpi Windows (192dpi instead of 96dpi).

Unfortunately the Qt framework does not have support for high-dpi yet (at least on Windows), so my application and all its elements looks half the size it should.

Is there any way to force/simulate automatic upscaling of such apps by Windows?

like image 495
Robin Lobel Avatar asked Jun 23 '14 13:06

Robin Lobel


People also ask

How do I fix apps that look small on high DPI and high resolution displays?

Select Display > Change the size of text, apps, and other items, and then adjust the slider for each monitor. Right-click the application, select Properties, select the Compatibility tab, and then select the Disable display scaling on high DPI settings check box.

What happens if I disable display scaling on high DPI settings?

Application: Windows will leave the application alone. This will disable DPI scaling for the application entirely, and it will appear tiny, but not blurry. This option was previously known as “Disable display scaling on high DPI settings”, and it does the same thing. System: Windows will use its normal behavior.

Does Windows DPI Scaling affect games?

Nope...it affects both Borderless and Exclusive modes in Full Screen or in Windowed.


2 Answers

Applications that use fixed coordinates and sizes will look small on high-DPI resolutions. Although even if using layouts there are some issues regarding element and font sizes and margins. Fortunately there is support for high-DPI displays since Qt 5.4 as there has been many high-DPI issue fixes.

An application on Windows can assume one of the following levels of "DPI Awareness" (From the Qt documentation) :

  • DPI Unaware: This level has been introduced in Windows-Vista. Windows will pretend to the application that it is running on a standard display of 96 DPI of 1920x1080 and scale the application accordingly. It is intended to accommodate older applications designed for low DPI displays. Some artifacts may result from this type of scaling.
  • System-DPI Aware: This level has been introduced in Windows-Vista. It differs from Per-Monitor DPI Aware only when multiple monitors are connected. Windows will calculate a scaling suitable for all connected monitors.
  • Per-Monitor DPI Aware: This level has been introduced in Windows 8.1. Windows does not perform any scaling at all.

Also it states that :

Qt applications by default are Per-Monitor DPI Aware on Windows 8.1 or System-DPI Aware on older versions of Windows. As of Qt 5.4, the level can be specified by passing a parameter to the platform plugin (see Using qt.conf):

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

You can read more information here.

In general to have a good UI on high-DPI displays, consider the following :

  • Use the latest version of Qt
  • Use layouts and avoid fixed sizes (unless you calculate scaling ratios on your own)
  • Make appropriate DPI-related settings depending on your application needs, for example set Qt::AA_UseHighDpiPixmaps attribute if you work with QPainter and pixmaps, or calculate a scaling ratio for adjusting certain element sizes in special situations.
like image 90
Nejat Avatar answered Sep 29 '22 21:09

Nejat


Qt fully supports high DPI monitors from Qt 5.6 onward, via attribute or environment variable (except on OS X where support is native). For the attribute method, use:

#include <QApplication>

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

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

or set the system environment variable:

QT_AUTO_SCREEN_SCALE_FACTOR=1

I've tested both methods on windows 10 with a high-DPI surfacebook monitor and the results are scaled properly as expected.

like image 34
Nicolas Holthaus Avatar answered Sep 29 '22 21:09

Nicolas Holthaus