Spec-Zone.ru › Qt 5.6

Qt для встраиваемых систем Linux

С выпуска Qt 5.0, Qt больше не содержит собственной реализации системы окон (QWS). Для однопроцессных случаев использования Qt Platform Abstraction является более предпочтительным решением. Поддержка нескольких графических процессов возможна через Wayland.

Существует несколько плагинов платформы, потенциально применимых для встраиваемых систем Linux: EGLFS, LinuxFB, KMS, DirectFB, Wayland. Доступность этих плагинов зависит от конфигурации Qt. По умолчанию используется плагин платформы, специфичный для устройства. Например, на многих устройствах по умолчанию выбран плагин eglfs. Если плагин по умолчанию не подходит, можно использовать параметр переменной среды QT_QPA_PLATFORM, чтобы запросить другой плагин. В качестве альтернативы, для быстрых тестов, можно использовать параметр командной строки -platform с тем же синтаксисом.

Настройка конкретного устройства

Компиляция Qt для заданного устройства требует инструментальной цепочки и корневой системы. Кроме того, для некоторых устройств требуется адаптационный код, специфичный для поставщика, для поддержки EGL и OpenGL ES 2.0. Это не актуально для платформ без ускорения, например, тех, которые используют плагин LinuxFB, предназначенный только для программной отрисовки. Это означает, что Qt Quick 2 не будет работать в такой конфигурации, поскольку он зависит от OpenGL для отрисовки.

В каталоге qtbase/mkspecs/devices содержится конфигурационный и графический адаптационный код для ряда устройств. Например, mkspec linux-rasp-pi2-g++ содержит настройки сборки, такие как оптимальные флаги компилятора и компоновщика для устройства Raspberry Pi 2. Mkspec также содержит информацию об реализации eglfs хуков (код адаптации, специфичный для поставщика) или ссылку на подходящий плагин интеграции устройства eglfs. Устройство выбирается через параметр -device инструмента конфигурации configure. Имя, которое следует после этого аргумента, должно, по крайней мере частично, соответствовать одному из подкаталогов в devices.

Ниже приведён пример конфигурации для Raspberry Pi 2. Для большинства встраиваемых устройств Linux команда configure выглядит примерно так:

./configure -release -opengl es2 -device linux-rasp-pi2-g++ -device-option CROSS_COMPILE=$TOOLCHAIN/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf- -sysroot $ROOTFS -prefix /usr/local/qt5

Наиболее важными параметрами являются -device и -sysroot. Указав -sysroot, файлы заголовков и библиотеки, используемые тестами обнаружения функций configure, а также сами Qt, берутся из указанного расположения, а не из стандартных расположений хост-компьютера. Это означает, что установка пакетов разработки на хост-машине не имеет значения. Например, для получения поддержки libinput не достаточно и не требуется установка заголовков и библиотек разработки libinput на хост-системе. Вместо этого заголовки и библиотеки для целевой архитектуры (например, ARM) должны быть присутствовать в sysroot.

pkg-config поддерживается также при кросс-компиляции. configure автоматически устанавливает PKG_CONFIG_LIBDIR, чтобы pkg-config сообщал настройки компилятора и компоновщика, основанные на sysroot, а не на хост-машине. Это обычно работает без дополнительных настроек. Однако переменные окружения, такие как PKG_CONFIG_PATH, должны быть сброшены для хост-машины перед запуском configure. В противном случае сборка Qt может попытаться использовать неподходящие заголовки и библиотеки с хост-системы.

Указание -sysroot приводит к автоматическому установлению аргумента --sysroot при вызове компилятора. В некоторых случаях это нежелательно и может быть отключено путём передачи -no-gcc-sysroot в configure.

-prefix, -extprefix и -hostprefix контролируют целевой каталог сборки Qt. В приведённом примере ARM-версия Qt должна быть размещена в /usr/local/qt5 на целевом устройстве. Обратите внимание, что запуск make install не развернёт ничего на устройстве. Вместо этого этап install ориентируется на каталог, указанный в extprefix, который по умолчанию равен sysroot + prefix, и, следовательно, является необязательным. Однако во многих случаях "загрязнение" корневой системы нежелательно, и поэтому указание -extprefix становится важным. Наконец, -hostprefix позволяет разделить инструменты хоста, такие как qmake, rcc, uic, от библиотек для целевой системы. При указании таких инструментов они будут установлены в указанный каталог, а не в extprefix.

Для получения дополнительной информации см. Параметры конфигурации Qt.

Плагины платформы для встраиваемых устройств Linux

EGLFS

EGL — это интерфейс между OpenGL и собственной системой окон. Qt может использовать EGL для управления контекстом и поверхностями, однако API не содержит специфики платформы: создание родного окна (которое не обязательно будет реальным окном на экране) всё равно должно выполняться средствами, специфичными для платформы. Отсюда и необходимость адаптационного кода, специфичного для платы или графического процессора. Такие адаптации предоставляются либо в виде eglfs хуков, которые могут быть одним файлом исходного кода, скомпилированным в плагин платформы, либо в виде динамически загружаемых плагинов интеграции устройств EGL.

EGLFS — это плагин платформы для запуска приложений Qt5 на основе EGL и OpenGL ES 2.0 без реальной системы окон (например, X11 или Wayland). Помимо Qt Quick 2 и нативных приложений OpenGL, он также поддерживает окна с программной отрисовкой (например, QWidget). В последнем случае содержимое виджетов отрисовывается процессором в изображения, которые затем загружаются в текстуры и комбинируются плагином.

Это рекомендуемый плагин для современных встраиваемых устройств Linux, которые включают графический процессор.

EGLFS заставляет первое окно верхнего уровня (будь то QWidget или QQuickView) стать полноэкранным. Это окно также выбирается в качестве корневого окна виджета, в которое комбинируются все другие окна верхнего уровня (например, диалоги, всплывающие меню или раскрывающиеся списки). Это необходимо, так как с EGLFS всегда существует ровно одно родное окно и поверхность окна EGL, и они принадлежат виджету или окну, которое создаётся первым. Этот подход хорошо работает, когда существует главное окно, которое существует в течение всего времени жизни приложения, а все другие виджеты являются либо не главными, либо создаются позже, после того как главное окно отображено.

Существуют дополнительные ограничения для окон на основе OpenGL. Начиная с Qt 5.3, eglfs поддерживает единственное полноэкранное окно GL (например, окно OpenGL на основе QWindow, QQuickView или QGLWidget). Открытие дополнительных окон OpenGL или смешивание таких окон с содержимым, основанным на QWidget, не поддерживается и завершает приложение с сообщением об ошибке.

При необходимости eglfs можно настроить с помощью следующих переменных среды:

  • QT_QPA_EGLFS_FB - Переопределяет устройство буфера кадров. По умолчанию /dev/fb0. На большинстве встраиваемых платформ это не так актуально, потому что буфер кадров используется только для запроса параметров, таких как размеры дисплея. Однако на некоторых устройствах этот параметр позволяет указать используемый дисплей в нескольких конфигурациях дисплея, подобно параметру fb в LinuxFB.
  • QT_QPA_EGLFS_WIDTH и QT_QPA_EGLFS_HEIGHT - Содержат ширину и высоту экрана в пикселях. Хотя eglfs пытается определить размеры из устройства буфера кадров /dev/fb0, но это не всегда работает, и может потребоваться ручное указание размеров.
  • QT_QPA_EGLFS_PHYSICAL_WIDTH и QT_QPA_EGLFS_PHYSICAL_HEIGHT - Физическая ширина и высота экрана в миллиметрах. На платформах, где устройство буфера кадров /dev/fb0 недоступно или запрос не удаётся, значения вычисляются на основе значения DPI по умолчанию 100. Эта переменная может быть использована для переопределения таких значений по умолчанию.
  • QT_QPA_EGLFS_DEPTH - Переопределяет глубину цвета экрана. На платформах, где устройство буфера кадров /dev/fb0 недоступно или запрос не удаётся, используется значение по умолчанию 32. Эта переменная может быть использована для переопределения таких значений по умолчанию. Обратите внимание, что это влияет только на значение глубины цвета, сообщаемое QScreen. Это не имеет связи с конфигурациями EGL и глубиной цвета, используемой для отрисовки OpenGL.
  • QT_QPA_EGLFS_SWAPINTERVAL - По умолчанию будет запрошен интервал обмена 1. Это позволяет синхронизировать с вертикальной частотой обновления дисплея. Значение может быть переопределено с помощью этой переменной среды. Например, передача 0 отключит блокировку при обмене, что позволит работать с максимальной скоростью без синхронизации.
  • QT_QPA_EGLFS_FORCEVSYNC - При установке eglfs запрашивает FBIO_WAITFORVSYNC на устройстве буфера кадров.
  • QT_QPA_EGLFS_FORCE888 - При установке значения игнорируются размеры каналов красного, зеленого и синего цвета при создании нового контекста, окна или offscreen поверхности. Вместо этого плагин запрашивает конфигурацию с 8 битами на канал. Это может быть полезно на устройствах, где конфигурации с менее чем 32 или 24 битами на пиксель выбираются по умолчанию, но, как известно, не подходят, например, из-за эффектов полос. Вместо изменения всех приложений эта переменная предоставляет более простой способ принудительного задания конфигураций 24/32 bpp для данного устройства.
  • QT_QPA_EGLFS_DEBUG - При установке значения печатается отладочная информация на выходной канал отладки. Например, входной QSurfaceFormat и свойства выбранной конфигурации EGL выводятся при создании нового контекста. В сочетании с переменной QSG_INFO Qt Quick, это может предоставить полезную информацию для устранения неполадок, связанных с конфигурацией EGL.
  • QT_QPA_EGLFS_INTEGRATION - Помимо встроенных хуков, также можно предоставить адаптацию, специфичную для устройства или поставщика, в виде динамически загружаемых плагинов. Эта переменная среды принудительно устанавливает определённый плагин. Например, установка значения eglfs_kms использует бэкенд KMS/DRM. Это возможно только в том случае, если никакие статические или встроенные хуки не были указаны в устройстве makespec. На практике традиционные встроенные хуки редко используются, практически все бэкенды теперь мигрировали в плагины. В устройстве makespecs всё ещё имеется соответствующая запись EGLFS_DEVICE_INTEGRATION: имя предпочтительного бэкенда для данного устройства. Это необязательно, но очень полезно, чтобы избежать необходимости установки этой переменной среды в случае наличия более одного плагина в целевой системе. В среде рабочего стола бэкенды KMS или X11 имеют приоритет в зависимости от наличия переменной среды DISPLAY. Обратите внимание, что на некоторых платах вместо фактического плагина используется специальное значение none. Это указывает на то, что для использования EGL с буфером кадров не требуется специальная интеграция, и поэтому не нужно загружать плагины.

Помимо QT_QPA_EGLFS_DEBUG, eglfs также поддерживает более современную систему категорированного логгирования Qt. Доступны следующие категории логгирования:

  • qt.qpa.egldeviceintegration – Включает ведение журнала для динамически загружаемых бэкендов. Очень полезно для проверки используемого бэкенда.
  • qt.qpa.input – Включает вывод отладки как из обработчиков ввода evdev , так и libinput . Очень полезно для проверки, был ли распознан и открыт заданный ввод устройства.
  • qt.qpa.eglfs.kms – Включает подробный вывод журнала в бэкенде KMS/DRM.

LinuxFB

Этот плагин записывает данные непосредственно в буфер кадра. Поддерживается только программная отрисовка. Обратите внимание, что на некоторых конфигурациях производительность отображения может быть ограничена.

Плагин linuxfb позволяет указывать дополнительные параметры, передавая их в переменной среды QT_QPA_PLATFORM или опцией командной строки -platform. Например, QT_QPA_PLATFORM=linuxfb:fb=/dev/fb1 указывает, что вместо стандартного fb0 должен использоваться буфер кадра /dev/fb1. Несколько параметров можно указать, разделив их двоеточием.

  • fb=/dev/fbN - Указывает устройства буфера кадра. На многодисплейных системах это обычно позволяет запускать приложение на разных дисплеях. Пока нет возможности использовать несколько буферов кадра из одного приложения Qt.
  • size=<width>x<height> - Указывает размер экрана в пикселях. Плагин пытается получить размеры отображения, как физические, так и логические, из устройства буфера кадра. Однако это может не всегда приводить к корректным результатам, поэтому может потребоваться явно указать значения.
  • mmsize=<width>x<height> - Физическая ширина и высота в миллиметрах.
  • offset=<width>x<height> - Смещение в пикселях, определяющее верхний левый угол экрана. По умолчанию положение в (0, 0).
  • nographicsmodeswitch - Не переключаться на графический режим виртуальной терминальной сессии (KD_GRAPHICS). Помимо переключения на графический режим, обычно также отключаются мигающий курсор и выключение экрана. При установке этого параметра эти функции также пропускаются.
  • tty=/dev/ttyN - Заменяет виртуальную консоль. Используется только когда nographicsmodeswitch не установлено.

Входные данные

При отсутствии оконной системы мышь, клавиатура и сенсорный ввод считываются напрямую через evdev или с помощью вспомогательных библиотек, таких как libinput или tslib. Обратите внимание, что это требует, чтобы узлы устройств /dev/input/event* были доступны для чтения пользователем. eglfs и linuxfb имеют весь код обработки ввода, скомпилированный в приложение.

Использование libinput

libinput - библиотека для обработки устройств ввода. Она предлагает альтернативу собственному механизму Qt для обработки ввода evdev. Для включения использования libinput, убедитесь, что файлы разработки для libudev и libinput доступны при настройке и сборке Qt. xkbcommon также необходим, если требуется поддержка клавиатуры. С eglfs и linuxfb дополнительных действий не требуется, так как эти плагины используют libinput по умолчанию. Если поддержка libinput недоступна или переменная окружения QT_QPA_EGLFS_NO_LIBINPUT установлена, используются собственные обработчики evdev Qt.

Ввод на eglfs и linuxfb без libinput

Параметры, такие как имя узла устройства, могут быть установлены в переменных окружения QT_QPA_EVDEV_MOUSE_PARAMETERS, QT_QPA_EVDEV_KEYBOARD_PARAMETERS и QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS. Кроме того, встроенные обработчики ввода можно отключить, установив QT_QPA_EGLFS_DISABLE_INPUT или QT_QPA_FB_DISABLE_INPUT в 1. На некоторых сенсорных экранах координаты необходимо повернуть, что делается путем установки QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS в rotate=180.

Мышь

Курсор мыши отображается всякий раз, когда QT_QPA_EGLFS_HIDECURSOR (для eglfs) или QT_QPA_FB_HIDECURSOR (для linuxfb) не установлены, и Qt обнаружил, что по крайней мере одна мышь доступна. Если поддержка libudev отсутствует, курсор мыши всегда отображается, если явно не отключен через переменную среды.

Поддержка подключения по горячей замене поддерживается, только если Qt был сконфигурирован с поддержкой libudev (то есть, если заголовки разработки libudev присутствуют в sysroot во время конфигурации). Это позволяет подключать или отключать устройство ввода во время работы приложения.

Клавиатура

Обработчик клавиатуры evdev поддерживает следующие дополнительные параметры:

  • /dev/input/... - Указывает имя устройства ввода. Если не указано, Qt ищет подходящее устройство, либо через libudev, либо путем перебора доступных узлов.
  • grab - Включает захват устройства ввода.
  • keymap - Указывает имя файла пользовательской карты клавиатуры.
  • enable-compose - Включает композирование.
  • repeat-delay - Устанавливает пользовательскую задержку повтора клавиши.
  • repeat-rate - Устанавливает пользовательскую скорость повтора клавиши.

На системах Embedded Linux, где сессии терминала не отключены, поведение при нажатии клавиши может быть непредсказуемым, так как событие ввода обрабатывается приложением Qt и tty. Для решения этой проблемы доступны следующие варианты:

  • EGLFS и LinuxFB пытаются отключить клавиатуру терминала при запуске приложения, установив режим клавиатуры tty в K_OFF. Это предотвращает попадание нажатий клавиш в терминал. Если требуется восстановить стандартное поведение, установите переменную среды QT_QPA_ENABLE_TERMINAL_KEYBOARD в 1. Обратите внимание, что это работает только при запуске приложения из удаленной консоли (например, через ssh) и при включенном вводе с клавиатуры терминала.
  • Альтернативный подход заключается в использовании параметра grab обработчика клавиатуры evdev, передавая grab=1 в QT_QPA_EVDEV_KEYBOARD_PARAMETERS. Это приводит к попытке захвата устройства ввода. Если захват grab успешно выполнен, другие компоненты системы не получают события от него до завершения работы приложения Qt. Этот подход более подходит для приложений, запускаемых удаленно, так как он не требует доступа к устройству tty.
  • Наконец, для многих специализированных образов Embedded Linux бессмысленно включать стандартные сессии терминалов. Обратитесь к документации вашей среды сборки для получения информации о том, как их отключить. Например, при создании образов с помощью Yocto Project, сброс SYSVINIT_ENABLED_GETTYS приводит к отсутствию процесса getty и, следовательно, отсутствию ввода на любом виртуальном терминале.

Если встроенная карта клавиш по умолчанию недостаточна, можно указать другую, либо через параметр keymap, либо с помощью функции eglfs-специфичной loadKeymap(). Последний вариант позволяет изменять карту клавиш во время выполнения. Однако это требует использования встроенного обработчика клавиатуры eglfs; он не поддерживается, когда обработчик клавиатуры загружается через параметр командной строки -plugin.

Примечание: Специальные системные сочетания клавиш, такие как переключение на консоль (Ctrl+Alt+Fx) или сброс (Ctrl+Alt+Backspace), в настоящее время не поддерживаются и игнорируются.

Для создания пользовательской карты клавиш можно использовать утилиту kmap2qmap. Она находится в модуле qttools. Исходные файлы должны быть в стандартном формате Linux kmap, который понимает команда ядра loadkeys . Это означает, что для создания файлов qmap можно использовать следующие источники:

  • Проект Linux Console Tools (LCT).
  • Xorg X11 карты клавиш могут быть преобразованы в формат kmap с помощью утилиты ckbcomp.
  • Так как файлы kmap являются обычными текстовыми файлами, их также можно создать вручную.

kmap2qmap - это программа командной строки, которая требует как минимум 2 файла в качестве параметров. Последний — сгенерированный файл .qmap, а все остальные обрабатываются как входные файлы .kmap. Например:

kmap2qmap i386/qwertz/de-latin1-nodeadkeys.kmap include/compose.latin1.inc de-latin1-nodeadkeys.qmap

Примечание: kmap2qmap не поддерживает все (псевдо)символы, которые поддерживает ядро Linux. При преобразовании стандартной карты клавиш будет отображено несколько предупреждений о Show_Registers, Hex_A и т. д.; эти сообщения можно безопасно игнорировать.

Тouch

Для некоторых резистивных сенсорных экранов с одним сенсорным датчиком может потребоваться вернуться к использованию tslib вместо использования протокола Linux multi-touch и устройств событий. Для современных сенсорных экранов это не обязательно. Поддержка tslib может быть включена путем установки переменной среды QT_QPA_EGLFS_TSLIB или QT_QPA_FB_TSLIB в 1. Для изменения устройства установите переменную среды TSLIB_TSDEVICE или передайте имя устройства в командной строке. Обратите внимание, что обработчик ввода tslib генерирует события мыши и поддерживает только одно касание, в отличие от evdevtouch , который также генерирует истинные многосенсорные события QTouchEvent.

Планшеты с ручкой

Плагин evdevtablet обеспечивает базовую поддержку планшетов с ручкой Wacom и аналогичных устройств. Он генерирует только события QTabletEvent. Чтобы включить его, передайте QT_QPA_GENERIC_PLUGINS=evdevtablet в переменной среды или, как альтернативу, передайте параметр -plugin evdevtablet в командной строке. Плагин может принимать параметр имени узла устройства, например QT_QPA_GENERIC_PLUGINS=evdevtablet:/dev/event1, в случае, если автоматическое обнаружение устройств Qt (основанное на libudev или проходе по /dev/input/event*) не работает или работает неправильно.

Отладка устройств ввода

Можно вывести некоторую информацию в вывод отладки, включив правило ведения журнала qt.qpa.input, например, установив переменную среды QT_LOGGING_RULES в значение qt.qpa.input=true. Это полезно для определения используемого устройства или для устранения неполадок в обнаружении устройств.

Использование пользовательских изображений курсора мыши

eglfs поставляется со своими изображениями курсора мыши размером 32x32. Если этого недостаточно, можно предоставить пользовательскую карту курсора, установив переменную среды QT_QPA_EGLFS_CURSOR в имя файла JSON. Файл также можно встроить в приложение через систему ресурсов Qt.

Например, встроенная карта курсора с 8 изображениями курсора на строке может быть указана следующим образом:

{
  "image": ":/cursor-atlas.png",
  "cursorsPerRow": 8,
  "hotSpots": [
      [7, 2],
      [12, 3],
      [12, 12],
      ...
  ]
}

Обратите внимание, что изображения должны быть плотно упакованы в карте: ширина и высота курсоров определяются на основе общего размера изображения и параметра cursorsPerRow. Карты должны предоставлять изображение для всех поддерживаемых курсоров.

Вывод на экран

При подключении нескольких дисплеев уровень поддержки нацеливания на один или несколько из них из одного приложения Qt варьируется между плагинами платформы и часто зависит от устройства и его графического стека.

eglfs с бэкендом eglfs_kms

При использовании бэкенда KMS/DRM, eglfs сообщает обо всех доступных экранах в QGuiApplication::screens(). Приложения могут нацеливать различные окна на разные экраны с помощью QWindow::setScreen(). Однако ограничение одного полноэкранного окна на экран по-прежнему действует.

При разработке на определенном встраиваемом устройстве часто необходимо проверить поведение устройства и драйверов, а также убедиться, что подключенные дисплеи работают должным образом. Один из простых способов — использовать пример hellowindow. Запуск с -platform eglfs --multiscreen --timeout аргументами отображает вращающийся логотип Qt на каждом подключенном экране на несколько секунд.

Бэкенд KMS/DRM также поддерживает пользовательские конфигурации через файл JSON. Установите переменную среды QT_QPA_EGLFS_KMS_CONFIG на имя файла, чтобы включить эту возможность. Файл также можно встроить в приложение с помощью системы ресурсов Qt. Пример конфигурации ниже:

{
  "device": "/dev/dri/card1",
  "hwcursor": false,
  "pbuffers": true,
  "outputs": [
    {
      "name": "VGA1",
      "mode": "off"
    },
    {
      "name": "HDMI1",
      "mode": "1024x768"
    }
  ]
}

Здесь мы настраиваем указанное устройство таким образом, чтобы:

  • оно не использовало аппаратный курсор (возвращается к отображению курсора мыши через OpenGL; по умолчанию аппаратные курсоры включены, так как они эффективнее),
  • оно будет использовать QOffscreenSurface со стандартными поверхностями EGL pbuffer (по умолчанию это отключено, и вместо этого используется поверхность gbm),
  • вывод на VGA-разъём отключен, а HDMI активен с разрешением 1024x768.

Кроме того, такая конфигурация также отключает поиск устройства через libudev и вместо этого используется указанное устройство.

Для устранения неполадок может быть полезно включить отладочные логи из бэкенда KMS/DRM. Для этого включите правило категорированной регистрации qt.qpa.eglfs.kms.

eglfs с бэкендом eglfs_kms_egldevice

Этот бэкенд, как правило, используется на устройствах Tegra, аналогичен бэкенду KMS/DRM, упомянутому выше, за исключением того, что он полагается на расширения EGLDevice и EGLStream вместо GBM.

Для технических подробностей об этом подходе ознакомьтесь с данной презентацией.

Множественные экраны в настоящее время не поддерживаются этим бэкендом. Вместо этого он найдет первый доступный дисплей и выберет соответствующий ему слой EGL. При необходимости это можно переопределить, установив переменную среды QT_QPA_EGLFS_LAYER_INDEX на индекс желаемого слоя. Чтобы увидеть доступные слои и устранить потенциальные проблемы при запуске, включите категорию регистрации qt.qpa.eglfs.kms. В некоторых случаях может потребоваться выполнение установки режима видео при запуске приложения, даже если экран сообщает, что нужное разрешение уже установлено. Это обычно оптимизируется, но если экран остается выключенным, попробуйте установить переменную среды QT_QPA_EGLFS_ALWAYS_SET_MODE в отличное от нуля значение и перезапустить приложение.

eglfs с другими бэкендами

Другие бэкенды, которые, как правило, основаны на нацеливании на фреймбуфер или API композиции непосредственно через реализацию EGL поставщика, обычно предоставляют ограниченную или никакую поддержку нескольких дисплеев. На платах на базе i.MX6 с графическими процессорами Vivante переменная среды QT_QPA_EGLFS_FB может использоваться для указания фреймбуфера, на который необходимо нацелиться, аналогично linuxfb. На Raspberry Pi переменная среды QT_QPA_EGLFS_DISPMANX_ID может использоваться для указания экрана, на который необходимо выводить изображение. Значение соответствует одному из DISPMANX_ID_ констант, см. документацию Dispmanx. Обратите внимание, что эти подходы, в отличие от KMS/DRM, обычно не позволят выводить изображение на несколько экранов из одного приложения. Кроме того, также могут быть доступны специфичные для драйвера переменные среды или параметры ядра для управления используемым фреймбуфером. См. документацию по встраиваемому устройству.

Видеопамять

Системы с фиксированным объемом выделенной видеопамяти могут потребовать дополнительной осторожности перед запуском приложения Qt, основанного на Qt Quick или классах, таких как QOpenGLWidget. Значение по умолчанию может быть недостаточным для таких приложений, особенно при отображении на экране высокого разрешения (например, Full HD). В этом случае они могут начать работать непредсказуемым образом. Рекомендуется обеспечить наличие как минимум 128 МБ памяти графического процессора. Для систем, не имеющих выделенного объёма памяти для графического процессора, это не проблема.

linuxfb

Используйте параметр плагина fb для указания устройства фреймбуфера, которое нужно использовать.

Обработчики сигналов Unix

Плагины платформы для консольных систем, такие как eglfs и linuxfb, по умолчанию устанавливают обработчики сигналов для захвата прерывания (SIGINT), приостановки и возобновления (SIGTSTP, SIGCONT ) и завершения (SIGTERM). Таким образом, клавиатура, курсор терминала и, возможно, другое состояние графики могут быть восстановлены при завершении или приостановке приложения из-за kill, или Ctrl+C или Ctrl+Z. (хотя завершение или приостановку с помощью клавиатуры возможно только при установке QT_QPA_ENABLE_TERMINAL_KEYBOARD, как указано выше в разделе Ввод). Однако в некоторых случаях захват SIGINT может быть нежелателен, так как он может конфликтовать с удаленной отладкой, например. Поэтому предоставляется переменная среды QT_QPA_NO_SIGNAL_HANDLER для отказа от всех встроенных обработчиков сигналов.

Плагины платформы для систем оконного интерфейса на встраиваемых устройствах Linux

XCB

Это плагин X11, используемый на обычных настольных платформах Linux. В некоторых встраиваемых средах, которые предоставляют X и необходимые файлы разработки для xcb, этот плагин работает так же, как и на обычном настольном компьютере.

Примечание: На некоторых устройствах поддержка EGL и OpenGL недоступна в X, так как реализация EGL несовместима с Xlib. В этом случае плагин XCB собирается без поддержки EGL, что означает, что приложения Qt Quick 2 или другие приложения на основе OpenGL не работают с этим плагином платформы. Тем не менее, его можно использовать для запуска приложений с программным рендерингом (например, на основе QWidget).

В общем случае использование XCB на встраиваемых устройствах не рекомендуется. Плагины, такие как eglfs, вероятно, обеспечат лучшую производительность и аппаратное ускорение.

Wayland

Wayland — легкая система оконного интерфейса; точнее, это протокол для взаимодействия клиентов с сервером отображения.

Модуль Qt Wayland предоставляет плагин платформы wayland, который позволяет приложениям Qt подключаться к композитору Wayland.

Примечание: У вас могут возникнуть проблемы с вводом сенсорного экрана при использовании эталонного композитора Weston. Для получения дополнительной информации см. вики Qt.

Связанные темы

  • Qt для создания устройств
  • Эмулятор
  • Виртуальная клавиатура Qt

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.6/embedded-linux.html

Spec-Zone.ru

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