Spec-Zone.ru › Qt 5.9

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

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

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

Эта плотность пикселей измеряется в точках на дюйм (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» в 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.9/highdpi.html

Spec-Zone.ru

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