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:
parent
2d76f991d0
commit
9a39b3c796
@ -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())
|
||||||
|
@ -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()
|
||||||
|
Loading…
Reference in New Issue
Block a user