Comments 6
Рецепт 4. Не используйте атрибут Qt::AA_EnableHighDpiScaling
Вообще, эта проблема с округлением по большей части решается с помощью QT_SCALE_FACTOR_ROUNDING_POLICY=PassThrough
, хоть там тоже своих особенностей хватает, но это тем не менее может являться решением для тех случаев, когда важен именно автоскейлинг абсолютных размеров, так сказать "дёшево и сердито".
О, супер-актуальная проблема сейчас, QT_SCALE_FACTOR_ROUNDING_POLICY=PassThrough
установлен, а с SVG в QML все равно проблема на high dpi + zoom 120% - мылит :(
Здесь 1 = System-DPI Aware.
И на пустом месте зарубили поддержку систем с несколькими мониторами с разным DPI.
Что стоит поменять, так это dpiAwareness
, который подсовывается по умолчанию при сборке проекта: https://docs.microsoft.com/en-us/windows/win32/hidpi/setting-the-default-dpi-awareness-for-a-process#setting-default-awareness-with-the-application-manifest
Не используйте атрибут
Qt::AA_EnableHighDpiScaling
Таким образом, просто установить атрибут
Qt::AA_EnableHighDpiScaling
и не делать больше ничего (не применять описанные рецепты) не получится.
Если применить совет выше, то очень даже получится. Вообще, этот атрибут убрали из Qt6, сделав его по умолчанию.
отвратительно масштабирует текст на масштабах 125% (100% вместо 125%), 150% (200% вместо 150%), 175% (200% вместо 175%) и др.
Ну правильно, нужно вызвать заклинание QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
Но как уже верно подметили, на стиле windowsvista могут появиться артефакты.
Рецепт 5. Увеличьте все иконки или переходите на векторный формат
Не всё так просто... Если иконка 16x16, то велика вероятность получить мыло на обычном мониторе. Поэтому для себя принял решение брать старый добрый ICO с расширениями 16, 32, 48, 64, 96 пикселей, чтобы можно было адаптировать иконку к любому экрану. QIcon
умеет грузить все размеры из ICO, так что руками ничего задавать не нужно. Только нужно установить атрибут Qt::AA_UseHighDpiPixmaps
(насколько я помню, он тоже включен по умолчанию в Qt6).
Итого, усреднённый рецепт такой:
Установить dpiAwareness=PerMonitorDpiAwarev2, включить Qt::AA_EnableHighDpiScaling
и Qt::AA_UseHighDpiPixmaps
, заменить иконки в PNG на иконки в ICO (или SVG, но на свой страх и риск). Всё.
(шутка, дальше вас ждёт удивительный мир багов в Qt)
Спасибо за материал!
Очень долго (с 2018) пытаюсь решить проблему спинбокса. Может быть, подскажете? Уже Qt 6.6.0, а проблема там же. На скейлингах не-100% (т.е. у 95% пользователей) вид спинбокса сильно плывёт артекфактами:
Ничего нестандартного, просто кинул спинбокс. От изменения вертикального размера его просто иначе плющит. На 100% ничего такого нет. Поставил qt.conf, какой-то разницы нет.
Да и в самом Qt Designer в ЕГО собственных спинбоксах такие же артефактищи.
Покрутил немного. "Решается" проблема установкой QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Ceil);
, но размеры становятся не тем, что задизайнили (наверху — в дизайнере, внизу — приложение в запуске):
У меня стоит 125%, похоже Ceil уводит его в 150%.
Вот в этом и дело. Если не применять советы из статьи, а пытаться применять обходные пути типа QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Ceil);
то начинают лезть артефакты с неконтролируемыми размерами. А касательно вашей исходной проблемы со спинбоксом - может быть, поможет установка стилей.
Адаптация Qt-приложений под мониторы высокой чёткости. Часть 1