Hi all,

We’ve recently merged several patches which improves Qt’s high-DPI support. The 
changes include:

* Support for fractional device pixel ratios (e.g. Windows 150%)
* Support per-screen DPI in more places like QStyle
* Cleanup of configuration API and options.

These fixes applies mostly to the AA_EnableHighDpiScaling type of high-DPI 
support where 
the device independent coordinate system is set up by QtGui. Relevant platforms 
include Windows,
X11, and Android. The new code and and config options are cross-platform 
though; it should be
possible to develop and test on any platform (as long as you are not working on 
platform plugins).

The following is a summary of the most relevant configuration options and API,
ignoring some of the more obscure, and now deprecated options:

* Platform plugins: 

Scale factor computation has been moved to cross-platform code in order to 
support rounding
policy options. Platforms now provide per-screen DPI values and any natively 
applied scale factor:
                
- QPlatformScreen::logicalBaseDpi()  [new] : the base DPI on the system (e.g. 
96 on Windows, 72 on macOS)
- QPlatformScreen::logicalDpi()            : the logical DPI of the screen 
(e.g. 144 on Windows 150%)
- QPlatformScreen::devicePixelRatio()      : the scale factor applied by the 
OS/Windowing system (e.g. 1 or 2)

[QPlatformScreen::pixelDensity() will no longer be called]


* Environment variables for development and testing:

- QT_SCALE_FACTOR                  : enables devicePixelRatio scaling in QtGui, 
applies a global scale factor.
- QT_ENABLE_HIGHDPI_SCALING [new]  : enables devicePixelRatio scaling in QtGui; 
applies per-screen
                                     scale factors computed from on screen DPI.
- QT_FONT_DPI [now x-platform]     : overrides the DPI for all screens

QT_FONT_DPI was previously x11 only, and is now cross-platform. 
QT_ENABLE_HIGHDPI_SCALING corresponds to
Qt::AA_EnableHighDpiScaling.


* Scale factor rounding policy

Today, Qt rounds scale factors which can result in mismatched UI sizes. We’ve 
now added API for setting the rounding policy:

- QT_SCALE_FACTOR_ROUNDING_POLICY=Round|Ceil|Floor|RoundPreferFloor|PassThrough
- 
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy)

Where the PassThrough option results in no scale factor rounding, which means 
that the visual UI size
will match font sizes and also the UI sizes of other applications. Note that 
this policy applies only when
computing a scale factor from screen DPI in QtGui; scale factors from 
QPlatformScreen::devicePixelRatio() or
QT_SCALE_FACTOR are used as-is.


* Manual test

tests/manual/highdpi/highdpi —metrics 

This test app displays a summary of the screen/DPI/DPR configuration. Also 
lists relevant
environment variables.


No changes to Qt’s high-dpi support goes without follow-up work, so please
let me know if there are regressions, or contact me if you have questions.

Cheers,
Morten


_______________________________________________
Development mailing list
Development@qt-project.org
https://lists.qt-project.org/listinfo/development

Reply via email to