QPA는 Qt5의 플랫폼 추상화 레이어이며 기존에있던 QWS 및 Qt 4의 플랫폼 포트를 대체하기 위한 목적으로 설계되었다. QPA는 4.8 버전에서는 실험적으로 적용되었고 Qt5에서 정식으로 지원하였다.
플랫폼 윈도우 시스템의 종속적인 구현을 캡슐화하여 다양한 플랫폼에 대응하기위한 것으로 윈도우 시스템 통합을 위한 QPlatformIntegration및 QPlatformWindow와 같은 클래스들이 존재한다.
간단히 얘기하면 Qt UI를 새로운 윈도우시스템에 이식하는 것을 유연하게 하기위한 추상화 계층인 것이다.
QPA는 플러그인 라이브러리 형태로 존재하고 Qt Application이 실행될때 로딩된다. 임베디드 리눅스 환경에서는 Application을 실행할 때 -platform 옵션을 통해 해당 플랫폼 플러그인을 선택할 수 있다.
아래는 QPA를 나타내는 그림이다.
▲QPA아키텍쳐
QPA 플러그인을 개발 하기 위한 문서가 많지 않아 다른 플러그인을 보고 API를 어떻게 구현하는지 확인 해야한다.
다만 테스트를 위해 Qt 5와 함께 제공되는 minimal플러그인 2개와 임베디드 리눅스 시스템에서 잠재적으로 사용할 수 있는 여러 플랫폼 플러그인들(EGLFS, LinuxFB, DirectFB, Wayland)이 있으며 이 것들은 예제로 사용할 수 있다.
qtbase/src/plugins/platforms/minimal/ qtbase/src/plugins/platforms/minimalegl/
Qt4.8에서 알려진 문제점으로는 입력과 포커스처리, Qt단위 테스트를 수행 하지 않았다.
이문제로 인한 특정 위젯(QWidget)으로 입력 이벤트가 전달 되지 않는 문제도 발생된다.
위에서 설명한 것처럼 QPA는 Qt4.8에서 실험적인 적용되었기 때문에 이 버전에서 QPA사용은 문제 발생의 여지가 있다는 것을 의미한다.
QPA에 대해 자세히 설명하는 영상이 있다.
EGLFS
EGLFS는위에서 얘기한 여러 플랫폼 플러그인중에 하나인데, X11 또는 Wayland와 같은 실제 윈도우시스템 없이 EGL 및 OpenGL ES 2.0을 기반으로 Qt 응용 프로그램을 실행하기 위한 플랫폼 플러그인이다.
Qt Quick 2 및 기본 OpenGL 응용 프로그램 외에도 소프트웨어로 렌더링 된 창 (예를들면 QWidget 기반으로 작성된)도 지원한다.
후자의 경우에는 위젯의 내용이 CPU를 사용하여 이미지로 렌더링 된 다음 텍스처로 업로드되고 플러그인에 의해 합성된다. 이것은 GPU가 포함 된 최신 임베디드 리눅스 장치에 권장되는 플러그인이기도하다.
EGLFS는 하나의 최상위 창 (QWidget 또는 QQuickView)을 전체 화면으로 만드는데, 이 창은 다른 모든 최상위 위젯 (예 : 대화 상자, 팝업 메뉴 또는 콤보 상자의 드롭 다운 등...)이 합성되는 루트 위젯 창으로 선택된다.
EGLFS 기반에서 입력장치(Input)
윈도우 시스템이없는 경우 마우스, 키보드 및 터치 입력은 evdev를 통해 직접 읽거나 libinput 또는 tslib와 같은 helper라이브러리를 사용하여 직접 읽을 수 있다. 이 경우는 장치 노드 /dev/input/event*를 사용자가 읽을 수 있어야하지만
eglfs와 linuxfb는 컴파일 된 모든 입력 처리 코드를 가지고있다.
libinput 사용
libinput은 입력 장치를 처리하는 라이브러리이다. libinput을 사용 가능하게하려면 Qt를 구성하고 컴파일할 때 libudev 및 libinput 용 개발 패키지(헤더파일, 라이브러리등)를 사용할 수 있어야한다.
아래 링크에서 참조 및 인용:
http://doc.qt.io/qt-5/embedded-linux.html
https://wiki.qt.io/Qt_Platform_Abstraction
https://wiki.qt.io/DirectFBAndQt
http://doc.qt.io/qt-5/qpa.html
아래표는 각 임베디드 프랫폼을 비교한 것이다. (임베디드 시스템 환경에서 유의해야 할 부분이다.)
|
OpenGL |
Multiple Window |
|
Single Process |
Multi Process |
||
directfb |
O |
O |
X |
eglfs |
O |
X |
X |
linuxfb |
X |
O |
X |
wayland |
O |
O |
O |
xcb |
O |
O |
O |