Мониторы с высокой плотностью пикселей
Мониторы с высокой плотностью пикселей обладают повышенной плотностью пикселей по сравнению со стандартными мониторами.
Плотность пикселей измеряется в точках на дюйм (DPI) или пикселях на дюйм (PPI) и определяется количеством пикселей дисплея и их размером. Следовательно, одного только количества пикселей недостаточно для определения относится ли монитор к категории мониторов с высокой плотностью пикселей.
Монитор 4K имеет фиксированное количество пикселей (~8 млн), однако его DPI варьируется от 185 (23 дюйма) до 110 (40 дюймов). Первый вариант примерно вдвое превышает стандартное разрешение рабочего стола 96 DPI; второй вариант лишь немного превосходит это разрешение.
Проблемы с мониторами высокой плотности пикселей
Мониторы с высокой плотностью пикселей создают некоторые трудности для существующих приложений:
- Приложения, использующие пользовательские интерфейсы с фиксированными координатами, выглядят маленькими Сочетание указания размера шрифта в пунктах и других размеров в пикселях особенно проблематично, поскольку пункты независимы от разрешения монитора. Например, предположим, что у нас есть рамка размером 40x20 пикселей вокруг текста "hello". Если мы используем шрифт размером 12 пунктов, он будет выглядеть правильно на мониторах с низким разрешением. Но на мониторах с высокой плотностью пикселей рамка будет слишком маленькой, что приведет к обрезанию текста.
- Приложения должны адаптироваться к ситуациям, когда пользователи имеют несколько дисплеев с различными разрешениями Например, пользователь может использовать монитор 4K для окна документа в программе для редактирования изображений, но монитор с низким разрешением для инструментария.
Традиционно, для поддержки мониторов высокой плотности пикселей Qt масштабирует шрифты автоматически и предоставляет значение DPI, которое код приложения может использовать для масштабирования остальной части пользовательского интерфейса.
Поддержка мониторов высокой плотности пикселей на системном уровне
Qt поддерживает режим высокой плотности пикселей, где основная система координат виртуализируется и делается независимой от плотности пикселей дисплея. Некоторые операционные системы, такие как macOS и iOS, реализуют этот режим. Кроме того, если операционная система не поддерживает этот режим, Qt имеет реализацию для резервного варианта.
Теперь геометрия задается в независимых от устройства пикселях. Это включает геометрию виджетов и элементов, геометрию событий, геометрию рабочего стола, окна и экрана, а также скорости анимации. Вывод рендерится в пикселях устройства, что соответствует разрешению дисплея. devicePixelRatio — это отношение между независимыми от устройства пикселями и системой координат пикселей устройства.
Как правило, большинство приложений работают с пикселями, независимыми от устройства; за исключением OpenGL и кода для растровой графики.
Поддержка операционных систем
Поддерживаемые Qt операционные системы предлагают следующее для мониторов высокой плотности пикселей:
macOS и iOS
Платформы Apple реализуют масштабирование и виртуализацию системы координат в операционной системе. Обычно никакой специальной конфигурации не требуется.
В macOS поддержка высокой плотности пикселей активируется параметрами в файле Info.plist; поэтому убедитесь, что эти параметры присутствуют.
<key>NSPrincipalClass</key> <string>NSApplication</string> <key>NSHighResolutionCapable</key> <string>True</string>
Более новые версии qmake будут генерировать файл Info.plist с ключом NSPrincipalClass; этого достаточно, так как NSHighResolutionCapable по умолчанию имеет значение true.
Примечание: macOS и iOS могут применять дополнительную виртуализацию, так что пиксели устройства больше не соответствуют пикселям дисплея в соотношении 1:1. Это происходит на iPhone 6+ и в macOS с включенным параметром «масштабирование дисплея».
Microsoft Windows
Масштабирование
Пользователи выбирают коэффициент масштабирования в Панели управления или через контекстное меню. Это работает путем изменения значений, возвращаемых функциями для запроса системных метрик, для стандартных размеров шрифтов, размеров рамок окон и т. д. Это не производит никакого реального масштабирования.
DPI-осознавание
Приложение в Windows может принять один из следующих уровней «DPI-осознавания»:
| Уровень DPI-осознавания | Значение |
|---|---|
| DPI-неосознанное | Этот уровень был представлен в Windows Vista. Для приложения Windows имитирует работу на стандартном дисплее с разрешением 96 DPI 1920x1080 и соответственно масштабирует приложение. Он предназначен для адаптации старых приложений, разработанных для дисплеев с низким DPI. Такое масштабирование может привести к некоторым артефактам. |
| Система-DPI-осознанное | Этот уровень был представлен в Windows Vista. Он отличается от DPI-осознанного по каждому монитору только при подключении нескольких мониторов. Windows вычисляет масштабирование, подходящее для всех подключенных мониторов. |
| DPI-осознанное по каждому монитору | Этот уровень был представлен в Windows 8.1. Windows не выполняет никакого масштабирования вообще. |
По умолчанию приложения Qt настроены на DPI-осознанное по каждому монитору в Windows 8.1 или Система-DPI-осознанное в более старых версиях Windows. Начиная с Qt 5.4, этот уровень можно указать с помощью параметра плагина платформы:
<application> -platform windows:dpiawareness=0,1,2
Дополнительную информацию см. в Использование qt.conf.
Поддержка высокой плотности пикселей в Qt
Qt предоставляет следующие способы обработки поддержки высокой плотности пикселей в вашем приложении.
- Возможность предоставления растровых изображений или графики для высокого разрешения. Для получения более подробной информации см. Отрисовка версий растровых изображений и изображений высокого разрешения.
- Qt 5.6 поддерживает кроссплатформенное масштабирование высокой плотности пикселей для устаревших приложений, аналогично масштабированию, выполняемому в macOS по умолчанию. Это позволяет приложениям, написанным для экранов с низкой плотностью пикселей, работать без изменений на устройствах с высокой плотностью пикселей. Эта функция включается по выбору и может быть включена с помощью следующих переменных среды:
-
QT_AUTO_SCREEN_SCALE_FACTOR[булево] включает автоматическое масштабирование на основе плотности пикселей монитора. Это не изменит размер шрифтов, заданных в пунктах, так как пункт является физической единицей измерения. Для нескольких экранов могут быть установлены различные коэффициенты масштабирования. -
QT_SCALE_FACTOR[числовое] определяет глобальный коэффициент масштабирования для всего приложения, включая шрифты, заданные в пунктах. -
QT_SCREEN_SCALE_FACTORS[список] определяет коэффициенты масштабирования для каждого экрана. Это не изменит размер шрифтов, заданных в пунктах. Переменная среды в основном полезна для отладки или для решения проблем с мониторами, у которых неверная информация EDID(Extended Display Identification Data).Формат может представлять собой список коэффициентов масштабирования, разделенных точкой с запятой, в том же порядке, что и в QGuiApplication::screens(), или список пар
name=value, разделенных точкой с запятой, гдеnameсовпадает с QScreen::name().
Хотя macOS полностью поддерживает высокую плотность пикселей, настольный стиль Windows в настоящее время имеет некоторые ограничения при определенных коэффициентах масштабирования. В таких случаях рассмотрите использование стиля Fusion вместо него, который поддерживает высокую плотность пикселей во всех случаях.
Примечание: Коэффициенты масштабирования, отличные от целых чисел, могут вызвать значительные артефакты масштабирования/рисования.
-
- Атрибут приложения
Qt::AA_EnableHighDpiScaling, введенный в Qt 5.6, включает автоматическое масштабирование на основе плотности пикселей монитора. - Атрибут приложения
Qt::AA_DisableHighDpiScaling, введенный в Qt 5.6, отключает все масштабирование. Это предназначено для приложений, которым требуются реальные координаты системы окон независимо от переменных среды. Этот атрибут имеет приоритет над Qt::AA_EnableHighDpiScaling. - Переменная среды QT_ENABLE_HIGHDPI_SCALING, введенная в Qt 5.14, включает автоматическое масштабирование на основе плотности пикселей монитора. Заменяет QT_AUTO_SCREEN_SCALE_FACTOR.
- Переменная среды QT_SCALE_FACTOR_ROUNDING_POLICY и API QGuiApplication::highDpiScaleFactorRoundingPolicy, введенные в Qt 5.14, позволяют управлять тем, следует ли и как округлять коэффициент пикселей устройства до ближайшего целого числа. Это актуально для конфигураций, например, Windows со степенью масштабирования 150%. Возможные значения
Round,Ceil,Floor,RoundPreferFloor,PassThrough. См. документацию по перечислению Qt::HighDpiScaleFactorRoundingPolicy для полного описания вариантов. - В Qt 5.4 была реализована экспериментальная реализация масштабирования высокой плотности пикселей с помощью переменной среды
QT_DEVICE_PIXEL_RATIO, которую можно задать численным коэффициентом масштабирования илиauto. Эта переменная устарела в Qt 5.6.
Миграция существующих приложений
Чтобы быстро запустить приложение, разработанное для низкой плотности пикселей, на мониторах с высоким разрешением, рассмотрите один из следующих вариантов:
- Позвольте приложению работать как DPI-неосознанное в Windows
- Установите переменную среды
QT_AUTO_SCREEN_SCALE_FACTORв1.
Однако эти варианты могут привести к некоторым артефактам масштабирования или рисования.
В долгосрочной перспективе приложение должно быть адаптировано для работы без изменений:
- Всегда используйте версии qreal API рисования QPainter.
- Устанавливайте размеры окон и диалогов относительно соответствующего размера экрана.
- Замените жестко заданные размеры в макетах и коде рисования значениями, рассчитанными из метрик шрифта или размера экрана.
Словарь терминов высокой плотности пикселей
| Термин | Определение |
|---|---|
| Пиксели, независимые от устройства | Пиксели, используемые приложением (пространство пользователя), подлежащие масштабированию операционной системой или Qt. |
| Пиксели устройства | Пиксели устройства отображения. |
| Коэффициент пикселей устройства | Коэффициент масштабирования, применяемый либо операционной системой, либо Qt. |
| Логическое DPI | Разрешение, используемое для преобразования размеров шрифтов, определенных в пунктах, в размеры шрифтов в пикселях. Стандартные значения равны 96, 128, ... 192. |
| Физическое DPI | Физическое разрешение, полученное путем деления размера монитора на количество пикселей. |
| Пространство пользователя | Пространство координат, используемое приложением в пикселях, независимых от устройства. |
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/highdpi.html