Pular para conteúdo

Executando Aplicações Demo Qt

A imagem em execução no Sistema Embarcado Toradex com Framework Qt5 instalado já possui algumas aplicações exemplos, como:

  • cinematicexperience
  • qt5everywheredemo
  • qtsmarthome


Informações

  • QPA - Qt Platform Abstract
  • linuxfb - Linux FrameBuffer
  • eglfs - EGL Full Screen


Muitas informações e configurações desta prática e mais opções podem ser visualizadas em:
1. Configure an Embedded Linux Device
2. Qt for Embedded Linux
3. Qt for Embedded Linux - LinuxFB
4. Qt for Embedded Linux - EGLFS


Configurando qtbase para suportar EGLFS e LinuxFB

Para gerar uma imagem que o Framework Qt5 contenha suporte a EGLFS e Linuxfb, no Container do Yocto Project, acessar o diretório meta-treinamento e criar os diretorios recipes-qt/qt5 e criar o arquivo qtbase_git.bbappend.

Executar no TARGET
cd ~/treinamento/yp/poky/

cd meta-treinamento

mkdir -p recipes-qt/qt5

cd recipes-qt/qt5

touch qtbase_%.bbappend

Adicionar o conteúdo:
PACKAGECONFIG:append = " sql-sqlite eglfs linuxfb"

PACKAGECONFIG:remove = " examples"


Salve o arquivo!


Acesse o diretório de build e abra o arquivo conf/local.conf e adicione no final a configuração abaixo para forçar utilizar a versão v1 do libgpiod.

PREFERRED_VERSION_libgpiod = "1.6.4"


Salve o arquivo e compile novamente a imagem e posteriormente gerar novamente o SDK com bitbake <receita-da-imagem> -c populate_sdk.


Executando Aplicação Exemplo Qt5

Acessando o TARGET, testando uma das aplicações exemplo:

Executar no TARGET
cd /usr/share/qt5everywheredemo-1.0/


Executando com QPA linuxfb

Executar no TARGET
./QtDemo --platform linuxfb


Executando com QPA eglfs

Executar no TARGET
./QtDemo --platform eglfs

Resultado:

1
2
3
EGL: Warning: No default display support on wayland
Could not open egl display
Aborted (core dumped)

Depurando Problema de Execução


Habilitando QT_LOGGING_RULES para qt.qpa.*, com isso mais detalhes do QPA utilizada para execução e sua respectiva configuração:

Executar no TARGET
export QT_LOGGING_RULES="qt.qpa.*=true"

./QtDemo --platform eglfs

Resultado:

1
2
3
4
5
6
7
qt.qpa.egldeviceintegration: EGL device integration plugin keys: ("eglfs_emu", "eglfs_kms_egldevice", "eglfs_kms")
qt.qpa.egldeviceintegration: EGL device integration plugin keys (sorted): ("eglfs_emu", "eglfs_kms_egldevice", "eglfs_kms")
qt.qpa.egldeviceintegration: Trying to load device EGL integration "eglfs_emu"
qt.qpa.egldeviceintegration: Using EGL device integration "eglfs_emu"
EGL: Warning: No default display support on wayland
Could not open egl display
Aborted (core dumped)


Analisando o resultado acima, existe três opções de EGL device para integração: eglfs_emu, eglfs_kms_egldevice e eglfs_kms

Na linha 3 pode-se confirmar a utilização do eglfs_emu neste caso deveria ser eglfs_kms, resolvendo configurando uma variavei ambiente do Qt para isso QT_QPA_EGLFS_INTEGRATION:

Executar no TARGET
export QT_LOGGING_RULES="qt.qpa.*=true"

export QT_QPA_EGLFS_INTEGRATION=eglfs_kms

./QtDemo --platform eglfs

Resultado:

qt.qpa.egldeviceintegration: EGL device integration plugin keys: ("eglfs_emu", "eglfs_kms_egldevice", "eglfs_kms")
qt.qpa.egldeviceintegration: EGL device integration plugin keys (sorted): ("eglfs_kms", "eglfs_emu", "eglfs_kms_egldevice")
qt.qpa.egldeviceintegration: Trying to load device EGL integration "eglfs_kms"
qt.qpa.eglfs.kms: New DRM/KMS via GBM integration created
qt.qpa.egldeviceintegration: Using EGL device integration "eglfs_kms"
qt.qpa.eglfs.kms: platformInit: Opening DRM device
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_DRM|Device_VideoMask)
qt.qpa.input: Found matching devices ("/dev/dri/card0", "/dev/dri/card2", "/dev/dri/card1")
qt.qpa.eglfs.kms: Found the following video devices: ("/dev/dri/card0", "/dev/dri/card2", "/dev/dri/card1")
qt.qpa.eglfs.kms: Using "/dev/dri/card0"
qt.qpa.eglfs.kms: Using backend-provided DRM device /dev/dri/card0
qt.qpa.eglfs.kms: Creating GBM device for file descriptor 6 obtained from "/dev/dri/card0"
qt.qpa.eglfs.kms: Using dedicated drm event reading thread
qt.qpa.eglfs.kms: Initalizing event reader for device 0x55a0d6a340 fd 6
qt.qpa.eglfs.kms: Querying EGLDisplay
qt.qpa.eglfs.kms: Event r[   91.588084] QtDemo[437]: memfd_create() called without MFD_EXEC or MFD_NOEXEC_SEAL set
eader thread: entering event loop
drmModeGetResources failed (Operation not supported)
qt.qpa.input: evdevkeyboard: Using device discovery
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_Keyboard)
qt.qpa.input: Found matching devices ("/dev/input/event0")
qt.qpa.input: Adding keyboard at /dev/input/event0
qt.qpa.input: Try to create keyboard handler for "/dev/input/event0" ""
qt.qpa.input: Opening keyboard at /dev/input/event0
qt.qpa.input: Create keyboard handler with for device "/dev/input/event0"
qt.qpa.input: Unload current keymap and restore built-in
qt.qpa.input: numlock=0 , capslock=0, scrolllock=0
qt.qpa.input: evdevmouse: Using device discovery
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_Mouse|Device_Touchpad)
qt.qpa.input: Found matching devices ()
qt.qpa.input: evdevtouch: Using device discovery
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_Touchpad|Device_Touchscreen)
qt.qpa.input: Found matching devices ("/dev/input/event1")
qt.qpa.input: evdevtouch: Adding device at /dev/input/event1
qt.qpa.input: evdevtouch: Using device /dev/input/event1
qt.qpa.input: evdevtouch: /dev/input/event1: Protocol type B  (multi), filtered=no
qt.qpa.input: evdevtouch: /dev/input/event1: min X: 0 max X: 799
qt.qpa.input: evdevtouch: /dev/input/event1: min Y: 0 max Y: 479
qt.qpa.input: evdevtouch: /dev/input/event1: min pressure: 0 max pressure: 0
qt.qpa.input: evdevtouch: /dev/input/event1: device name: Atmel maXTouch Touchscreen
Cannot create window: no screens available
Aborted (core dumped)


Analisando as novas informações, primeiramente pode-se confirmar a correta configuração do EGL Device observando a saída da linha 5. Na sequencia o Qt tentara configurar e utilizar a saída de video/display disponivel, e na linha 8 tem as interfaces encontradas e na linha 10 a interface selecionada/escolhida por padrão, esta correta?


Confirmando quem é cada uma das Interfaces de Video/Display:

Executar no TARGET
ls -l /sys/class/drm/

Saída:

1
2
3
4
5
6
7
lrwxrwxrwx    1 root     root             0 May 29 18:48 card0 -> ../../devices/platform/bus@53100000/80000000.imx8_gpu0_ss/drm/card0
lrwxrwxrwx    1 root     root             0 Jun 30 14:38 card1 -> ../../devices/platform/display-subsystem/drm/card1
lrwxrwxrwx    1 root     root             0 Jun 30 14:38 card2 -> ../../devices/platform/bus@5a180000/5a180000.lcdif/drm/card2
lrwxrwxrwx    1 root     root             0 Jun 30 14:38 card2-DPI-1 -> ../../devices/platform/bus@5a180000/5a180000.lcdif/drm/card2/card2-DPI-1
lrwxrwxrwx    1 root     root             0 May 29 18:48 renderD128 -> ../../devices/platform/bus@53100000/80000000.imx8_gpu0_ss/drm/renderD128
lrwxrwxrwx    1 root     root             0 Jun 30 14:38 renderD129 -> ../../devices/platform/display-subsystem/drm/renderD129
-r--r--r--    1 root     root          4096 Jun 30 14:38 version


Filtrando no dmesg:

Executar no TARGET
dmesg | grep drm

Saída:

1
2
3
4
5
6
7
8
9
[    3.922335] systemd[1]: Starting Load Kernel Module drm...
[    4.482507] [drm] Initialized vivante 1.0.0 20170808 for 80000000.imx8_gpu0_ss on minor 0
[    9.060960] imx-drm display-subsystem: bound imx-drm-dpu-bliteng.2 (ops 0xffffffc080c594b0)
[    9.132236] imx-drm display-subsystem: bound imx-dpu-crtc.0 (ops 0xffffffc080c590b8)
[    9.161531] imx-drm display-subsystem: bound imx-dpu-crtc.1 (ops 0xffffffc080c590b8)
[    9.204117] [drm] Initialized imx-drm 1.0.0 20120507 for display-subsystem on minor 1
[    9.235165] imx-drm display-subsystem: [drm] Cannot find any crtc or sizes
[   10.431282] [drm] Initialized mxsfb-drm 1.0.0 20160824 for 5a180000.lcdif on minor 2
[   10.575735] mxsfb 5a180000.lcdif: [drm] fb0: mxsfb-drmdrmfb frame buffer device


O erro parece estar relacionado ao EGLFS utilizard o /dev/dri/card0 que é GPU, como não tem um Servidor Gráfico em execução X11 ou Wayland, deveria apontar para a saída da interface de display utilizada, neste caso LCD Interface(lcdif).


Deverá ser criado um arquivo chamado kms.conf e passar o caminho para acessar o arquivo atravéz da variável ambiente QT_QPA_EGLFS_KMS_CONFIG.

Executar no TARGET
touch /etc/kms.conf


Adicionar o conteúdo abaixo:

{
"device": "/dev/dri/card2",
  "hwcursor": false,
  "pbuffers": true,
  "outputs": [ ]
}


Exportando a variável ambiente:

Executar no TARGET
export QT_QPA_EGLFS_KMS_CONFIG=/etc/kms.conf


Executando a aplicação:

Executar no TARGET
./QtDemo --platform eglfs

Saída:

qt.qpa.egldeviceintegration: EGL device integration plugin keys: ("eglfs_emu", "eglfs_kms_egldevice", "eglfs_kms")
qt.qpa.egldeviceintegration: EGL device integration plugin keys (sorted): ("eglfs_kms", "eglfs_emu", "eglfs_kms_egldevice")
qt.qpa.egldeviceintegration: Trying to load device EGL integration "eglfs_kms"
qt.qpa.eglfs.kms: New DRM/KMS via GBM integration created
qt.qpa.egldeviceintegration: Using EGL device integration "eglfs_kms"
qt.qpa.eglfs.kms: platformInit: Opening DRM device
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_DRM|Device_VideoMask)
qt.qpa.input: Found matching devices ("/dev/dri/card0", "/dev/dri/card2", "/dev/dri/card1")
qt.qpa.eglfs.kms: Found the following video devices: ("/dev/dri/card0", "/dev/dri/card2", "/dev/dri/card1")
qt.qpa.eglfs.kms: Using "/dev/dri/card0"
qt.qpa.eglfs.kms: Using backend-provided DRM device /dev/dri/card0
qt.qpa.eglfs.kms: Creating GBM device for file descriptor 6 obtained from "/dev/dri/card0"
qt.qpa.eglfs.kms: Using dedicated drm event reading thread
qt.qpa.eglfs.kms: Initalizing event reader for device 0x55a0d6a340 fd 6
qt.qpa.eglfs.kms: Querying EGLDisplay
qt.qpa.eglfs.kms: Event r[   91.588084] QtDemo[437]: memfd_create() called without MFD_EXEC or MFD_NOEXEC_SEAL set
eader thread: entering event loop
root@colibri-imx8x-06846849:/usr/share/qt5everywheredemo-1.0# ./QtDemo --platform eglfs
qt.qpa.egldeviceintegration: EGL device integration plugin keys: ("eglfs_emu", "eglfs_kms_egldevice", "eglfs_kms")
qt.qpa.egldeviceintegration: EGL device integration plugin keys (sorted): ("eglfs_kms", "eglfs_emu", "eglfs_kms_egldevice")
qt.qpa.egldeviceintegration: Trying to load device EGL integration "eglfs_kms"
qt.qpa.eglfs.kms: Loading KMS setup from "/etc/kms.conf"
qt.qpa.eglfs.kms: Requested configuration (some settings may be ignored):
headless: false 
hwcursor: false 
pbuffers: true 
separateScreens: false 
virtualDesktopLayout: 0 
outputs: QMap()
qt.qpa.eglfs.kms: New DRM/KMS via GBM integration created
qt.qpa.egldeviceintegration: Using EGL device integration "eglfs_kms"
qt.qpa.eglfs.kms: platformInit: Opening DRM device
qt.qpa.eglfs.kms: GBM: Using DRM device "/dev/dri/card2" specified in config file
qt.qpa.eglfs.kms: Using backend-provided DRM device /dev/dri/card2
qt.qpa.eglfs.kms: Creating GBM device for file descriptor 5 obtained from "/dev/dri/card2"
qt.qpa.eglfs.kms: Using dedicated drm event reading thread
qt.qpa.eglfs.kms: Initalizing event reader for device 0x5594210400 fd 5
qt.qpa.eglfs.kms: Querying EGLDisplay
qt.qpa.eglfs.kms: Event reader thread: entering event loop
qt.qpa.eglfs.kms: Atomic reported as supported
qt.qpa.eglfs.kms: Atomic disabled
qt.qpa.eglfs.kms: Found 1 planes
qt.qpa.eglfs.kms: plane 0: id = 31 countFormats = 12 possibleCrtcs = 0x1 supported formats = RG16 BG16 XR24 AR24 XB24 AB24 RX24 RA24 AR15 XR15 AB15 XB15 
qt.qpa.eglfs.kms:   property 0: id = 8 name = 'type'
qt.qpa.eglfs.kms:   type is ENUM, value is 1, possible values are:
qt.qpa.eglfs.kms:     enum 0: Overlay - 0
qt.qpa.eglfs.kms:     enum 1: Primary - 1
qt.qpa.eglfs.kms:     enum 2: Cursor - 2
qt.qpa.eglfs.kms:   property 1: id = 17 name = 'FB_ID'
qt.qpa.eglfs.kms:   type is OBJECT
qt.qpa.eglfs.kms:   property 2: id = 18 name = 'IN_FENCE_FD'
qt.qpa.eglfs.kms:   type is SIGNED_RANGE, value is -1, possible values are:
qt.qpa.eglfs.kms:     -1
qt.qpa.eglfs.kms:     2147483647
qt.qpa.eglfs.kms:   property 3: id = 20 name = 'CRTC_ID'
qt.qpa.eglfs.kms:   type is OBJECT
qt.qpa.eglfs.kms:   property 4: id = 13 name = 'CRTC_X'
qt.qpa.eglfs.kms:   type is SIGNED_RANGE, value is 0, possible values are:
qt.qpa.eglfs.kms:     -2147483648
qt.qpa.eglfs.kms:     2147483647
qt.qpa.eglfs.kms:   property 5: id = 14 name = 'CRTC_Y'
qt.qpa.eglfs.kms:   type is SIGNED_RANGE, value is 0, possible values are:
qt.qpa.eglfs.kms:     -2147483648
qt.qpa.eglfs.kms:     2147483647
qt.qpa.eglfs.kms:   property 6: id = 15 name = 'CRTC_W'
qt.qpa.eglfs.kms:   type is RANGE, value is 800, possible values are:
qt.qpa.eglfs.kms:     0
qt.qpa.eglfs.kms:     2147483647
qt.qpa.eglfs.kms:   property 7: id = 16 name = 'CRTC_H'
qt.qpa.eglfs.kms:   type is RANGE, value is 480, possible values are:
qt.qpa.eglfs.kms:     0
qt.qpa.eglfs.kms:     2147483647
qt.qpa.eglfs.kms:   property 8: id = 9 name = 'SRC_X'
qt.qpa.eglfs.kms:   type is RANGE, value is 0, possible values are:
qt.qpa.eglfs.kms:     0
qt.qpa.eglfs.kms:     4294967295
qt.qpa.eglfs.kms:   property 9: id = 10 name = 'SRC_Y'
qt.qpa.eglfs.kms:   type is RANGE, value is 0, possible values are:
qt.qpa.eglfs.kms:     0
qt.qpa.eglfs.kms:     4294967295
qt.qpa.eglfs.kms:   property 10: id = 11 name = 'SRC_W'
qt.qpa.eglfs.kms:   type is RANGE, value is 52428800, possible values are:
qt.qpa.eglfs.kms:     0
qt.qpa.eglfs.kms:     4294967295
qt.qpa.eglfs.kms:   property 11: id = 12 name = 'SRC_H'
qt.qpa.eglfs.kms:   type is RANGE, value is 31457280, possible values are:
qt.qpa.eglfs.kms:     0
qt.qpa.eglfs.kms:     4294967295
qt.qpa.eglfs.kms:   property 12: id = 30 name = 'IN_FORMATS'
qt.qpa.eglfs.kms:   type is BLOB
qt.qpa.eglfs.kms: "UNKNOWN1" mode count: 1 crtc index: 0 crtc id: 33
qt.qpa.eglfs.kms: mode 0 800 x 480 @ 60 hz
qt.qpa.eglfs.kms: Selected mode 0 : 800 x 480 @ 60 hz for output "UNKNOWN1"
qt.qpa.eglfs.kms: Physical size is QSizeF(154, 86) mm for output "UNKNOWN1"
qt.qpa.eglfs.kms: Format is 34325258 requested_by_user = false for output "UNKNOWN1"
qt.qpa.eglfs.kms: Output "UNKNOWN1" framebuffer size is  QSize(800, 480)
qt.qpa.eglfs.kms:   property 0: id = 1 name = 'EDID'
qt.qpa.eglfs.kms:   type is BLOB
qt.qpa.eglfs.kms:   property 1: id = 2 name = 'DPMS'
qt.qpa.eglfs.kms:   type is ENUM, value is 0, possible values are:
qt.qpa.eglfs.kms:     enum 0: On - 0
qt.qpa.eglfs.kms:     enum 1: Standby - 1
qt.qpa.eglfs.kms:     enum 2: Suspend - 2
qt.qpa.eglfs.kms:     enum 3: Off - 3
qt.qpa.eglfs.kms:   property 2: id = 5 name = 'link-status'
qt.qpa.eglfs.kms:   type is ENUM, value is 0, possible values are:
qt.qpa.eglfs.kms:     enum 0: Good - 0
qt.qpa.eglfs.kms:     enum 1: Bad - 1
qt.qpa.eglfs.kms:   property 3: id = 6 name = 'non-desktop'
qt.qpa.eglfs.kms:   type is RANGE, value is 0, possible values are:
qt.qpa.eglfs.kms:     0
qt.qpa.eglfs.kms:     1
qt.qpa.eglfs.kms:   property 4: id = 4 name = 'TILE'
qt.qpa.eglfs.kms:   type is BLOB
qt.qpa.eglfs.kms:   property 5: id = 20 name = 'CRTC_ID'
qt.qpa.eglfs.kms:   type is OBJECT
qt.qpa.eglfs.kms:   property 0: id = 22 name = 'ACTIVE'
qt.qpa.eglfs.kms:   type is RANGE, value is 1, possible values are:
qt.qpa.eglfs.kms:     0
qt.qpa.eglfs.kms:     1
qt.qpa.eglfs.kms:   property 1: id = 23 name = 'MODE_ID'
qt.qpa.eglfs.kms:   type is BLOB
qt.qpa.eglfs.kms:   property 2: id = 19 name = 'OUT_FENCE_PTR'
qt.qpa.eglfs.kms:   type is RANGE, value is 0, possible values are:
qt.qpa.eglfs.kms:     0
qt.qpa.eglfs.kms:     18446744073709551615
qt.qpa.eglfs.kms:   property 3: id = 24 name = 'VRR_ENABLED'
qt.qpa.eglfs.kms:   type is RANGE, value is 0, possible values are:
qt.qpa.eglfs.kms:     0
qt.qpa.eglfs.kms:     1
qt.qpa.eglfs.kms: Output UNKNOWN1 can use 1 planes: 31 
qt.qpa.eglfs.kms: Chose plane 31 for output UNKNOWN1 (crtc id 33) (may not be applicable)
qt.qpa.eglfs.kms: Using plain OpenGL mouse cursor
qt.qpa.eglfs.kms: No EDID data for output "UNKNOWN1"
qt.qpa.eglfs.kms: Sorted screen list: QVector(OrderedScreen(QPlatformScreen=0x55942467d0 ("UNKNOWN1") : 2147483647 / QPoint(0,0) / primary: false))
qt.qpa.eglfs.kms: Adding QPlatformScreen 0x55942467d0 ( "UNKNOWN1" ) to QPA with geometry QRect(0,0 800x480) and isPrimary= false
qt.qpa.input: evdevkeyboard: Using device discovery
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_Keyboard)
qt.qpa.input: Found matching devices ("/dev/input/event0")
qt.qpa.input: Adding keyboard at /dev/input/event0
qt.qpa.input: Try to create keyboard handler for "/dev/input/event0" ""
qt.qpa.input: Opening keyboard at /dev/input/event0
qt.qpa.input: Create keyboard handler with for device "/dev/input/event0"
qt.qpa.input: Unload current keymap and restore built-in
qt.qpa.input: numlock=0 , capslock=0, scrolllock=0
qt.qpa.input: evdevmouse: Using device discovery
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_Mouse|Device_Touchpad)
qt.qpa.input: Found matching devices ()
qt.qpa.input: evdevtouch: Using device discovery
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_Touchpad|Device_Touchscreen)
qt.qpa.input: Found matching devices ("/dev/input/event1")
qt.qpa.input: evdevtouch: Adding device at /dev/input/event1
qt.qpa.input: evdevtouch: Using device /dev/input/event1
qt.qpa.input: evdevtouch: /dev/input/event1: Protocol type B  (multi), filtered=no
qt.qpa.input: evdevtouch: /dev/input/event1: min X: 0 max X: 799
qt.qpa.input: evdevtouch: /dev/input/event1: min Y: 0 max Y: 479
qt.qpa.input: evdevtouch: /dev/input/event1: min pressure: 0 max pressure: 0
qt.qpa.input: evdevtouch: /dev/input/event1: device name: Atmel maXTouch Touchscreen
qt.qpa.eglfs.kms: Creating gbm_surface for screen UNKNOWN1
qt.qpa.eglfs.kms: Got native format 34325258 from eglGetConfigAttrib() with return code true
qt.qpa.eglfs.kms: Adding FB, size 800x480, DRM format 0x34325258
qt.qpa.eglfs.kms: Setting mode for screen UNKNOWN1
qt.qpa.input: evdevtouch: Updating QInputDeviceManager device count: 1 touch devices, 0 pending handler(s)
qt.qpa.eglfs.kms: Adding FB, size 800x480, DRM format 0x34325258
qt.qpa.eglfs.kms: Adding FB, size 800x480, DRM format 0x34325258
qt.qpa.input.events: reporting TouchPoint(0 @QRectF(289,393 8x8) normalized QPointF(0.366708,0.82881) press 1 vel QVector2D(0, 0) state 1
qt.qpa.input.events: reporting TouchPoint(0 @QRectF(290,393 8x8) normalized QPointF(0.36796,0.82881) press 1 vel QVector2D(0, 0) state 2
qt.qpa.input.events: reporting TouchPoint(0 @QRectF(290,392 8x8) normalized QPointF(0.36796,0.826722) press 1 vel QVector2D(0, 0) state 2
qt.qpa.input.events: reporting TouchPoint(0 @QRectF(291,392 8x8) normalized QPointF(0.369212,0.826722) press 1 vel QVector2D(0, 0) state 2
qt.qpa.input.events: reporting TouchPoint(0 @QRectF(292,392 8x8) normalized QPointF(0.370463,0.826722) press 1 vel QVector2D(0, 0) state 2
qt.qpa.input.events: reporting TouchPoint(0 @QRectF(292,392 8x8) normalized QPointF(0.370463,0.826722) press 0 vel QVector2D(0, 0) state 8
qml: CREATING DEMO: demos/video/main.qml
qml: CREATED: demos/video/main.qml
QQmlComponent: Component is not ready
qrc:/qml/QtDemo/Slide.qml:187: TypeError: Cannot read property 'status' of null
qt.qpa.input.events: reporting TouchPoint(1 @QRectF(279,292 8x8) normalized QPointF(0.354193,0.617954) press 1 vel QVector2D(0, 0) state 1
qt.qpa.input.events: reporting TouchPoint(1 @QRectF(280,292 8x8) normalized QPointF(0.355444,0.617954) press 1 vel QVector2D(0, 0) state 2
qt.qpa.input.events: reporting TouchPoint(1 @QRectF(280,292 8x8) normalized QPointF(0.355444,0.617954) press 0 vel QVector2D(0, 0) state 8
qml: CREATING DEMO: demos/video/main.qml
qml: CREATED: demos/video/main.qml
QQmlComponent: Component is not ready


Sucesso!


Se preferir pode configurar através de variável ambiente o QPA a ser utilizado, exemplo:

Executar no TARGET
export QT_QPA_PLATFORM=eglfs


Variaveis Ambiente Qt

Algumas variaveis ambientes do Framework Qt muito uteis e pouco divulgadas:


Habilitado QPA GL no Logging

Executar no TARGET
export QT_LOGGING_RULES=qt.qpa.gl=true


Habilitando Scene Graph Info

Executar no TARGET
export QSG_INFO=1


Debug Plugins

Permite analisar e visualizar todos os plugins sendo carregados e utilizados, e ausentes tambem:

Executar no TARGET
export QT_DEBUG_PLUGINS=1 


Scene Graph Render Dump

Ajuda a analise crash com Renderização e problemas com Scene Graph:

Executar no TARGET
export QSG_RENDERER_DEBUG=dump


Habilitar EGLFS sem GPU

É possivel utilizar EGLFS em hardwares sem GPU, com versões > 5.7:

Executar no TARGET
export QMLSCENE_DEVICE=softwarecontext