[Interest] Qt high-DPI configuration patches for testing
Morten Sorvig
Morten.Sorvig at qt.io
Mon Oct 3 14:18:08 CEST 2016
Hi all,
Lately I’ve spent some time on high-DPI configuration options for Qt. This is
a somewhat complex area, with many different setups in the field. I’d like to
expose the patches to a wider audience to make sure we implement something that
works as well as possible. Please feel free to provide any feedback, either
privately or on this list.
The patches are based on Qt 5.6 and are available at:
https://codereview.qt-project.org/157175
(Use the “checkout” option to get the entire patch series)
Documentation patch is at:
https://codereview.qt-project.org/172125
The scope of the changes is improving the Qt::HighDpiScaling mode, with a focus on
configuration. I’ve tested on Windows and X11, with macOS as a dev platform. The result
of the work is some behavior changes and several new config options.
Should I test/How to I use this?
1) Set QT_AUTO_SCREEN_SCALE_FACTOR=1 or Qt::HighDpiScaling.
2) If not happy then
- Try setting QT_FONT_DPI and/or QT_SCALE_FACTOR to see how the application
reacts. Is it an application or QtWidgets/QtQuick issue?
- Set QT_USE_PHYSICAL_DPI=1 (if you know the values are correct)
- Set QT_SCREEN_SCALE_FACTORS=a;b;c to hardcode scale factors. (Known issue:
QT_AUTO_SCREEN_SCALE_FACTOR needs to be set as well for this)
3) Report findings to patch author; include "tests/manual/highdpi --metrics” outpu
and screenshots (if possible).
Some platform specific notes:
- X11: If you’ve had problems with mismatched text/ui sizes this should
now be better (if not solved). Qt now uses the global logical DPI by
default.
- Windows: Use fractional scale factors (like 150%) directly:
QT_SCALE_FACTOR_ROUNDING_POLICY=PassThrough
(See below for disclaimer and caveats)
Changes in detail:
- qtbase/tests/manual/highdpi --metrics prints the current configuration. Example:
screen name: Virtual1
widget devicePixelRatio: 1
widget logicalDpi: 96
platform screen logicalDpi: 96
platform screen logicalBaseDpi: 96
platform screen devicePixelRatio: 1
platform screen physicalDpi: 96.1115
QT_FONT_DPI:
QT_SCALE_FACTOR:
QT_AUTO_SCREEN_SCALE_FACTOR:
QT_SCREEN_SCALE_FACTORS:
QT_USE_PHYSICAL_DPI:
QT_SCALE_FACTOR_ROUNDING_POLICY:
QT_DPI_ADJUSTMENT_POLICY:
Here, the “widget” section are the values the application sees, the “platform”
section are the values returned by the OS/WS via the Qt platform plugin, and
finally QT_ sections shows the currently set environment variables.
- The screen logical DPI is now used for configuring the devicePixelRatio value.
This has been the case for Windows for some time; now all relevant platforms get
the same behavior. Set QT_USE_PHYSICAL_DPI to use physical DPI.
- In relation ot the above Qt now uses _either_ the logical or physical DPI,
which should reduce chance of getting inconsistent text and UI sizes.
- Qt may now optionally use non-integer factors (like 150% on windows):
QT_SCALE_FACTOR_ROUNDING_POLICY=PassThrough
We know that this may cause painting artifacts, in particularly with native
styles. On the other hand there are rapports that custom-styled apps work
fine.
- 1.5x (150% on Windows) is now rounded down to 1x: The visual effect of this
is that content appears visually small on such systems instead of visually
large. This arguably more acceptable. The rounding policy controls this as well:
QT_SCALE_FACTOR_ROUNDING_POLICY=Round|Ceil|Floor|RoundPreferFloor (default)
- QT_FONT_DPI now works on all platforms (mostly for testing purposes)
- QT_SCREEN_SCALE_FACTORS now correctly overrides the screen factors.
- QScreen::physicalDotsPerInch() is now a more physical value, independent of
Qt or OS scale factors, but not independent of scaling not detectable by Qt
such as the macOS “More Space” setting.
Thanks for reading this far :)
- Morten
More information about the Interest
mailing list