Spec-Zone.ru › Qt 5.13

Высокочастотные дисплеи

Высокочастотные дисплеи

Высокочастотные дисплеи — это дисплеи с повышенной плотностью пикселей по сравнению со стандартными дисплеями с высокой плотностью пикселей.

Эта плотность пикселей измеряется в точках на дюйм (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 системыЭтот уровень был введен в 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. Это позволяет приложениям, написанным для экранов с низкой частотой обновления, работать без изменений на устройствах с высокой частотой обновления. Эта функция включается по умолчанию и может быть включена с помощью следующих переменных среды:
    • 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.
  • Изменяйте размеры окон и диалоговых окон относительно размера экрана.
  • Замените жестко закодированные размеры в макетах и коде рисования значениями, рассчитанными на основе метрик шрифтов или размера экрана.

Словарь терминов высокочастотных дисплеев

ТерминОпределение
Пиксели, независимые от устройстваПиксели, используемые приложением (пространство пользователя), которые масштабируются операционной системой или 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/qt-5.13/highdpi.html

Spec-Zone.ru

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