Apply ScaleFactorRoundingPolicy to QT_SCREEN_SCALE_FACTORS

QT_SCREEN_SCALE_FACTORS in many cases set on behalf of the user,
instead of by the user, so we should make it less sharp and more
in line with standard high-dpi configuration.

Specifically, make it subject to the rounding policy set by
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(). This
means that applications which support integer scale factors
only will see integers only, also when QT_SCREEN_SCALE_FACTORS
specifies a fractional factor.

Users who want to override can set

  QT_SCALE_FACTOR_ROUNDING_POLICY=PassThrough

to restore the default Qt rounding behavior.

[ChangeLog][QtGui] The high-DPI scale factor rounding policy (settable with
QGuiApplication::setHighDpiScaleFactorRoundingPolicy() or
QT_SCALE_FACTOR_ROUNDING_POLICY) now applies to scale factors set
with QT_SCREEN_SCALE_FACTORS.

Pick-to: 6.4
Fixes: QTBUG-95930
Fixes: QTBUG-99546
Change-Id: Ibb0aa5cb9d3a356d33429d0efe69d984b2530728
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Morten Sørvig 2022-05-20 11:19:20 +02:00 committed by Morten Johan Sørvig
parent bc6dea891e
commit 1c0a56a2f3
2 changed files with 17 additions and 2 deletions

View File

@ -540,8 +540,10 @@ static const char scaleFactorProperty[] = "_q_scaleFactor";
/* /*
Sets a per-screen scale factor. Sets a per-screen scale factor.
*/ */
void QHighDpiScaling::setScreenFactor(QScreen *screen, qreal factor) void QHighDpiScaling::setScreenFactor(QScreen *screen, qreal rawFactor)
{ {
qreal factor = roundScaleFactor(rawFactor);
if (!qFuzzyCompare(factor, qreal(1))) { if (!qFuzzyCompare(factor, qreal(1))) {
m_screenFactorSet = true; m_screenFactorSet = true;
m_active = true; m_active = true;

View File

@ -313,9 +313,10 @@ void tst_QHighDpi::environment_QT_SCREEN_SCALE_FACTORS()
QFETCH(QByteArray, environment); QFETCH(QByteArray, environment);
QFETCH(QList<qreal>, expectedDprValues); QFETCH(QList<qreal>, expectedDprValues);
qputenv("QT_SCREEN_SCALE_FACTORS", environment);
// Verify that setting QT_SCREEN_SCALE_FACTORS overrides the from-platform-screen-DPI DPR. // Verify that setting QT_SCREEN_SCALE_FACTORS overrides the from-platform-screen-DPI DPR.
{ {
qputenv("QT_SCREEN_SCALE_FACTORS", environment);
std::unique_ptr<QGuiApplication> app(createStandardOffscreenApp(platformScreenDpi)); std::unique_ptr<QGuiApplication> app(createStandardOffscreenApp(platformScreenDpi));
int i = 0; int i = 0;
for (QScreen *screen : app->screens()) { for (QScreen *screen : app->screens()) {
@ -327,6 +328,18 @@ void tst_QHighDpi::environment_QT_SCREEN_SCALE_FACTORS()
QCOMPARE(window.devicePixelRatio(), expextedDpr); QCOMPARE(window.devicePixelRatio(), expextedDpr);
} }
} }
// Verify that setHighDpiScaleFactorRoundingPolicy applies to QT_SCREEN_SCALE_FACTORS as well
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Round);
{
std::unique_ptr<QGuiApplication> app(createStandardOffscreenApp(platformScreenDpi));
int i = 0;
for (QScreen *screen : app->screens()) {
qreal expectedRounderDpr = qRound(expectedDprValues[i++]);
qreal windowDpr = QWindow(screen).devicePixelRatio();
QCOMPARE(windowDpr, expectedRounderDpr);
}
}
} }
void tst_QHighDpi::environment_QT_USE_PHYSICAL_DPI() void tst_QHighDpi::environment_QT_USE_PHYSICAL_DPI()