Spec-Zone.ru › Qt 5.15

Дисплей с высокой плотностью пикселей

Дисплеи с высокой плотностью пикселей обладают большей плотностью пикселей по сравнению со стандартными дисплеями с высокой плотностью пикселей.

Плотность пикселей измеряется в точках на дюйм (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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API