Высокочастотные экраны
Высокочастотные экраны
Высокочастотные экраны — это экраны с повышенной плотностью пикселей по сравнению со стандартными экранами с высокой частотой DPI.
Плотность пикселей измеряется в точках на дюйм (DPI) или пикселях на дюйм (PPI) и определяется количеством пикселей экрана и его физическими размерами. Это означает, что количество пикселей само по себе недостаточно для определения того, относится ли экран к категории высокочастотных экранов.
Монитор 4K имеет фиксированное количество пикселей (~8 млн), однако частота DPI варьируется от 185 (23 дюйма) до 110 (40 дюймов). Первый вариант примерно в 2 раза больше стандартного разрешения рабочего стола 96 DPI, а второй — чуть выше.
Проблемы с высокочастотными экранами
Высокочастотные экраны вызывают ряд проблем для существующих приложений:
- Приложения, использующие графические интерфейсы с фиксированными координатами, выглядят маленькими. Особенно проблематична комбинация задания размера шрифта в пунктах и других размеров в пикселях, так как пункты независимы от разрешения монитора. Например, рамка размером 40x20 пикселей вокруг текста "привет" с шрифтом 12 пунктов выглядит корректно на мониторах с низким разрешением, но на мониторах с высокой частотой DPI рамка будет слишком маленькой, что приведет к обрезанию текста.
- Приложения должны адаптироваться к ситуациям, когда пользователи имеют несколько экранов с различным разрешением. Например, они могут использовать монитор 4K для окна документа в редакторе изображений и монитор с низким разрешением для палитры инструментов.
Традиционный подход к поддержке высокочастотных экранов заключался в автоматическом масштабировании шрифтов Qt и предоставлении значения DPI, которое приложение могло использовать для масштабирования остальной части графического интерфейса.
Обзор поддержки высокочастотных экранов в Qt
Qt поддерживает режим высокой частоты DPI, в котором основная система координат виртуализируется и делается независимой от плотности пикселей экрана. Этот режим реализован некоторыми операционными системами (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, уровень можно указать, передав параметр плагину платформы (см. Использование qt.conf):
<application> -platform windows:dpiawareness=0,1,2
Поддержка высокочастотных экранов в Qt
- Возможность предоставления растровых изображений или графических элементов для высокочастотных экранов: см. Отрисовка высококачественных версий растровых изображений и графических элементов.
- Qt 5.6 поддерживает кроссплатформенное масштабирование для высокочастотных экранов для устаревших приложений, аналогично масштабированию, выполняемому системой macOS. Это позволяет приложениям, написанным для экранов с низкой частотой DPI, работать без изменений на устройствах с высокой частотой DPI. Эта функция включена по запросу и может быть включена с помощью следующих переменных среды:
-
QT_AUTO_SCREEN_SCALE_FACTOR[логический тип] включает автоматическое масштабирование, основанное на плотности пикселей монитора. Это не изменит размер шрифтов с фиксированным размером в пунктах, так как пункт является физической единицей измерения. Для нескольких экранов могут быть установлены разные коэффициенты масштабирования. -
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 5.4. Она включалась переменной среды
QT_DEVICE_PIXEL_RATIO, которая могла быть установлена в числовое значение коэффициента масштабирования или"auto". Эта переменная устарела в Qt 5.6.
Миграция существующих приложений
Чтобы быстро запустить приложение, разработанное для низких значений DPI, на мониторах с высоким разрешением, рассмотрите один из вариантов масштабирования (позвольте приложению работать как неосведомленное о DPI в Windows или установите переменную среды QT_AUTO_SCREEN_SCALE_FACTOR в "1". Однако эти варианты могут привести к некоторым артефактам масштабирования или рисования.
В долгосрочной перспективе приложение следует адаптировать для работы без изменений:
- Всегда используйте qreal-версии API рисования QPainter.
- Устанавливайте размеры окон и диалоговых окон относительно размера экрана.
- Замените жестко заданные размеры в макетах и коде рисования значениями, рассчитанными из метрик шрифтов или размера экрана.
Словарь терминов высокочастотного DPI
| Термин | Определение |
|---|---|
| Независимые от устройства пиксели | Пиксели, используемые приложением (пространство пользователя), масштабируемые операционной системой или Qt. |
| Пиксели устройства | Пиксели устройства отображения. |
| Коэффициент пикселей устройства | Коэффициент масштабирования, применяемый операционной системой или Qt. |
| Логическая частота DPI | Разрешение, используемое для преобразования размеров шрифтов, определенных в пунктах, в размеры шрифтов в пикселях. Обычно одно из стандартных значений 96, 128, .. 192. |
| Физическая частота DPI | Физическое разрешение, полученное путем деления размера монитора на количество пикселей. |
| Экран Retina | См. Wikipedia о Retina-дисплеях |
| Пространство пользователя | Пространство координат, используемое приложением (Независимые от устройства пиксели). |
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/highdpi.html