Я работаю над приложением Qt (развертывание на Qt 5.11, но я тестирую на Qt 5.14), которое должно работать на различных проекторах. По крайней мере один из этих проекторов сообщает о физическом размере более одного метра, в результате чего ОС Linux сообщает только 32,5 т / д (по умолчанию 96 т / д). Эффект этого параметра в нашем приложении Qt заключается в том, что весь текст становится нечитабельно маленьким:
![Screenshot of problem](https://i.stack.imgur.com/3gs7d.png)
Его можно воспроизвести в любой системе, запустив
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. Может быть связано:
Так как мне обеспечить надежную работу во всех случаях?