From 86abb6fd8a8f680f9fc5ff1db775845c9f4e254b Mon Sep 17 00:00:00 2001 From: Michael Weghorn Date: Wed, 13 Mar 2024 12:27:12 +0100 Subject: [PATCH] tdf#159915 qt: Force Qt::HighDpiScaleFactorRoundingPolicy::Round For now, force `Qt::HighDpiScaleFactorRoundingPolicy::Round` for the HighDPI-scale factor rounding policy [1], which is the default for Qt 5, while Qt 6 defaults to `Qt::HighDpiScaleFactorRoundingPolicy::PassThrough` (see [2]), which resulted in broken rendering (e.g. "Help" -> "About" dialog not showing the whole content) when fractional display scaling like 150 % is configured in the KDE Plasma display settings (in contrast to manually setting the `QT_SCALE_FACTOR=1.5` env variable to apply scaling, which was working fine). Quoting from [3]: > The two principal options are whether fractional scale factors should be > rounded to an integer or not. Keeping the scale factor as-is will make > the user interface size match the OS setting exactly, but may cause > painting errors, for example with the Windows style. Manually setting the env variable `QT_SCALE_FACTOR_ROUNDING_POLICY="Round"` has the same effect (and can be used with LO versions not yet containing this fix). (There might be a way to adjust the way that scaling happens to make other policies work, but for now, just hard-code to the policy that is known to work.) [1] https://doc.qt.io/qt-6/qt.html#HighDpiScaleFactorRoundingPolicy-enum [2] https://doc.qt.io/qt-6/highdpi.html#environment-variable-reference [3] https://doc.qt.io/qt-6/qguiapplication.html#setHighDpiScaleFactorRoundingPolicy Change-Id: I8eb6911d4dd5faf00912b8f15a58e0bdace1995a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164768 Tested-by: Jenkins Reviewed-by: Michael Weghorn --- vcl/qt5/QtInstance.cxx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vcl/qt5/QtInstance.cxx b/vcl/qt5/QtInstance.cxx index 6b3bd0cc301ae..2801601115ecd 100644 --- a/vcl/qt5/QtInstance.cxx +++ b/vcl/qt5/QtInstance.cxx @@ -740,6 +740,11 @@ std::unique_ptr QtInstance::CreateQApplication(int& nArgc, char** // for scaled icons in the native menus QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); #endif + // force Qt::HighDpiScaleFactorRoundingPolicy::Round, which is the Qt 5 default + // policy and prevents incorrect rendering with the Qt 6 default policy + // Qt::HighDpiScaleFactorRoundingPolicy::PassThrough (tdf#159915) + QGuiApplication::setHighDpiScaleFactorRoundingPolicy( + Qt::HighDpiScaleFactorRoundingPolicy::Round); FreeableCStr session_manager; if (getenv("SESSION_MANAGER") != nullptr)