Почему Qt :: AA_DisableHighDpiScaling не отключает масштабирование с высоким DPI, и почему Qt :: AA_EnableHighDpiScaling его отключает? - PullRequest
1 голос
/ 28 января 2020

Я работаю над приложением Qt (развертывание на Qt 5.11, но я тестирую на Qt 5.14), которое должно работать на различных проекторах. По крайней мере один из этих проекторов сообщает о физическом размере более одного метра, в результате чего ОС Linux сообщает только 32,5 т / д (по умолчанию 96 т / д). Эффект этого параметра в нашем приложении Qt заключается в том, что весь текст становится нечитабельно маленьким:

Screenshot of problem

Его можно воспроизвести в любой системе, запустив

xrandr --dpi 32.5

перед запуском приложения.

Мы могли бы настроить dpi системы по-разному, но есть причины этого не делать: этот dpi на самом деле находится в правильном поле (оно даже слишком высокое), мы можем захотеть использовать его в других приложениях, и клиенты могут использовать собственный проектор, который может нарушить нашу ручную настройку.

Безопасный подход для этого конкретного случая использования - притвориться, что мы все еще живем в каменном веке: игнорируйте настройку dpi системы и просто используйте отображение 1: 1 между независимыми от устройства пикселями и пикселями устройства. Документация High DPI документация гласит:

Атрибут приложения Qt::AA_DisableHighDpiScaling, представленный в Qt 5.6, отключает все масштабирование. Это предназначено для приложений, которым требуются фактические координаты оконной системы, независимо от переменных среды. Этот атрибут имеет приоритет над Qt::AA_EnableHighDpiScaling.

Поэтому я добавил это как первую строку в main (до создания QApplication):

QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling);

Однако кажется, не имеет никакого эффекта; текст по-прежнему нечитаемо маленький. Я также пробовал это в различных комбинациях с:

QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling, false);
QCoreApplication::setAttribute(Qt::AA_Use96Dpi);

Ничто не оказывает видимого эффекта.

Что делает работа устанавливает QT_AUTO_SCREEN_SCALE_FACTOR=1 в среде. Если я правильно понимаю, это включит масштабирование, а не отключит его, но установка на 0 не работает!

Аналогично, если я включу Qt::AA_EnableHighDpiScaling в таком коде все становится читабельным:

QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

В некоторой степени также работает жесткое кодирование размера шрифта (найдено здесь ):

QFont font = qApp->font();
font.setPixelSize(11);
qApp->setFont(font);

Однако поля в макете все еще кажутся масштабированными, поэтому это приводит к очень тесному (хотя и пригодному для использования) макету.

Также работает установка QT_FONT_DPI=96 в среде (эта переменная, по-видимому, недокументирована, но это работает как минимум в Qt 5.11 и 5.14.

Либо в Qt есть ошибки, либо, скорее всего, я что-то неправильно понимаю. Как получилось, что включение масштабирования отключает его и наоборот?


Редактировать: только что протестировано на Qt 5.11, хотя и на другой системе. Там ни QT_AUTO_SCREEN_SCALE_FACTOR=1, ни QT_AUTO_SCREEN_SCALE_FACTOR=0 не работают, так что, похоже, мы в какой-то степени имеем дело с ошибками Qt. Может быть связано:

Так как мне обеспечить надежную работу во всех случаях?

...