Spec-Zone.ru › Qt

Вводные данные на встроенном устройстве Linux

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

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

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

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

Параметры, такие как имя узла устройства, могут быть заданы в переменных среды QT_QPA_EVDEV_MOUSE_PARAMETERS, QT_QPA_EVDEV_KEYBOARD_PARAMETERS и QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS; разделяйте записи двоеточием. Эти параметры являются альтернативой передаче настроек в аргументе командной строки -plugin, и в некоторых бэкэндах они являются обязательными. Но eglfs и linuxfb используют встроенные обработчики ввода, поэтому отдельный аргумент -plugin не используется.

Кроме того, встроенные обработчики ввода можно отключить, установив QT_QPA_EGLFS_DISABLE_INPUT (для eglfs) или QT_QPA_FB_DISABLE_INPUT (для linuxfb) в значение 1.

Мышь

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

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

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

Параметр Описание
/dev/input/... Указывает имя устройства ввода. Если не указано, Qt ищет подходящее устройство либо через libudev, либо, перебирая доступные узлы.
nocompress По умолчанию события ввода, которые не приводят к изменению позиции по сравнению с последним событием мыши Qt, сжимаются. Новое событие мыши Qt отправляется только после изменения положения или состояния кнопки. Чтобы отключить это поведение, установите параметр nocompress
dejitter Указывает предел джиттера; по умолчанию отключено.
grab При установке в 1, Qt захватывает устройство для эксклюзивного использования.
abs Некоторые сенсорные экраны сообщают абсолютные координаты и не могут быть дифференцированы от тачпадов. В этом случае укажите abs, чтобы указать, что устройство использует абсолютные события.

Клавиатура

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

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

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

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

Если стандартная встроенная карта клавиш недостаточна, вы можете указать другую через параметр keymap.

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

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

  • Проект Linux Console Tools (LCT).
  • Карты клавиш X11 X.org можно преобразовать в формат 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 и т. д.; эти сообщения можно игнорировать.

Касание

Хотя это не обязательно для современных сенсорных экранов, некоторые резистивные сенсорные экраны с одноточечным касанием могут потребовать возврата к использованию tslib вместо использования протокола многоточечного касания Linux и устройств событий.

Для включения поддержки tslib, установите переменную среды QT_QPA_EGLFS_TSLIB (для eglfs) или QT_QPA_FB_TSLIB (для linuxfb) в 1. Для изменения устройства, установите переменную среды TSLIB_TSDEVICE или передайте имя устройства в командной строке. Обратите внимание, что обработчик ввода tslib генерирует события мыши и поддерживает только одно касание в отличие от evdevtouch, который также генерирует истинные многоточечные события QTouchEvent.

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

Параметр Описание
/dev/input/... Указывает имя устройства ввода. Если не указано, Qt ищет подходящее устройство либо через libudev, либо, перебирая доступные узлы.
rotate На некоторых сенсорных экранах координаты необходимо повернуть, установив rotate в 90, 180 или 270.
invertx и inverty Указывает параметры для инвертирования координат X или Y в событиях ввода.

Например, если вы передадите следующие значения в QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS перед запуском приложений, у вас будет явно указанное устройство касания с инвертированными координатами. Это полезно, когда ориентация фактического экрана и сенсорного экрана не совпадает.

export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event5:rotate=180

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

Плагин 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. Атласы также должны предоставлять изображение для всех поддерживаемых курсоров.

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

Spec-Zone.ru

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