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:
parent
bc6dea891e
commit
1c0a56a2f3
@ -540,8 +540,10 @@ static const char scaleFactorProperty[] = "_q_scaleFactor";
|
||||
/*
|
||||
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))) {
|
||||
m_screenFactorSet = true;
|
||||
m_active = true;
|
||||
|
@ -313,9 +313,10 @@ void tst_QHighDpi::environment_QT_SCREEN_SCALE_FACTORS()
|
||||
QFETCH(QByteArray, environment);
|
||||
QFETCH(QList<qreal>, expectedDprValues);
|
||||
|
||||
qputenv("QT_SCREEN_SCALE_FACTORS", environment);
|
||||
|
||||
// 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));
|
||||
int i = 0;
|
||||
for (QScreen *screen : app->screens()) {
|
||||
@ -327,6 +328,18 @@ void tst_QHighDpi::environment_QT_SCREEN_SCALE_FACTORS()
|
||||
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()
|
||||
|
Loading…
Reference in New Issue
Block a user