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