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
[email protected]
https://lists.qt-project.org/listinfo/development