Дисплей с высокой плотностью пикселей
Дисплеи с высокой плотностью пикселей обладают большей плотностью пикселей по сравнению со стандартными дисплеями с высокой плотностью пикселей.
Плотность пикселей измеряется в точках на дюйм (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 системы | Этот уровень был представлен в 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[boolean] включает автоматическое масштабирование, основанное на плотности пикселей монитора. Это не изменит размер шрифтов, заданных в пунктах, поскольку пункт является физической единицей измерения. Для нескольких экранов могут быть разные коэффициенты масштабирования. -
QT_SCALE_FACTOR[числовой] определяет глобальный коэффициент масштабирования для всего приложения, включая шрифты, заданные в пунктах. -
QT_SCREEN_SCALE_FACTORS[список] указывает коэффициенты масштабирования для каждого экрана. Это не изменит размер шрифтов, заданных в пунктах. Переменная среды полезна в основном для отладки или для работы с мониторами с неправильной информацией EDID(расширенные данные идентификации дисплея).Формат может быть либо список коэффициентов масштабирования, разделенных точкой с запятой, в том же порядке, что и в 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.15/highdpi.html