Apply ScaleFactorRoundingPolicy to QT_SCREEN_SCALE_FACTORS

QT_SCREEN_SCALE_FACTORS is in many cases set on behalf of the user,
instead of by the user, so we should apply the standard app
scale factor policies to it, instead of interpreting it
as a user override.

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.

Fixes: QTBUG-95930
Fixes: QTBUG-99546
Change-Id: I936e96671fe2a0a43c3e8129f0768875cb011103
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Morten Sørvig 2023-02-15 14:34:35 +01:00 committed by Tor Arne Vestbø
parent 2d76f991d0
commit 9a39b3c796
2 changed files with 16 additions and 2 deletions

View File

@ -494,7 +494,8 @@ void QHighDpiScaling::updateHighDpiScaling()
qCDebug(lcHighDpi) << "Applying screen factors" << m_screenFactors; qCDebug(lcHighDpi) << "Applying screen factors" << m_screenFactors;
int i = -1; int i = -1;
const auto screens = QGuiApplication::screens(); const auto screens = QGuiApplication::screens();
for (const auto &[name, factor] : m_screenFactors) { for (const auto &[name, rawFactor]: m_screenFactors) {
const qreal factor = roundScaleFactor(rawFactor);
++i; ++i;
if (name.isNull()) { if (name.isNull()) {
if (i < screens.size()) if (i < screens.size())

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()