Qt 4 et 5 pour Linux embarqué
Pierre FICHEUX, pierre.ficheux@openwide.fr
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Qt, histoire
● Première version publiée par Trolltech en 1996 →
toolkit en C++
● Développé pour X11, 2 développeurs au départ,
fondateurs de Trolltech
● Outil multi-plateforme (Unix, Windows, MacOS)
● Connu grâce à KDE !
● Qt2 en 2000 → Qtopia (PDA sous Linux « Zaurus » de
SHARP)
● Jusqu’en 2008, double licence GPL/Propriétaire
● En 2008, achat par Nokia → LGPL
● Qt4 → + Symbian, WinCE, Maemo, ...
● En 2011 rapprochement Nokia / M$ → cédé à Digia en
2012
● Sortie de Qt 5.0 fin 2012 (Digia)
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Architecture Qt4
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Architecture Qt4, suite
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Qt5, quoi de neuf ?
● Plus de plate-formes supportées → mobile, Wayland
● Nouvelle architecture, modularité améliorée
● Plus de partage de code avec QPA (Qt Platform
Abstraction)
● Empreinte mémoire plus faible
● Au niveau utilisateur, code compatible avec Qt 4
● Contraintes matérielles plus importantes (accélération
OpenGL)
● Qt Quick 2
● Installation plus complexe sur cible embarquée
« exotique »
NOM
CLIENT
Qt pour Linux embarqué 6/2014
QtCore
QtNetwork QtGui
QtQml QtQuick
QtMultiMedia
QtTest QtSql
QtWebkit
Principaux modules Qt5
Partie IHM
NOM
CLIENT
Qt pour Linux embarqué 6/2014
QPA (Qt platform abstraction)
Win Mac Wayland SymbianX11 …Android
QAccessible
QFont
QPainter
QImageQOpenGL …
QWindow QScreen
QSurface
QInputMethodQOpenGLContext
Scene graph (in qtdeclarative) QBacki
ngStor
e
QWidgetQtWebkitQtQuick2 QtQuick1
Qt5 / QtGui
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Qt/Embedded architecture
● Basé par défaut sur le framebuffer de Linux (LinuxFB)
● Client/serveur → QWS = Qt Window System (supprimé
en Qt5)
● Pas d'accélération matérielle
● Peut utiliser un framebuffer « virtuel » (X11) avec QVFb
● Une application serveur (-qws), les autres clientes
● Le serveur gère en général l’affichage mais l’application
peut accéder directement à l’écran pour des raisons de
performances
● Configuration par défaut pour l'embarqué « léger » →
remplacé par X11 / OpenGL sur Qt5 (EGLFS)
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Principe de QWS
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Compilation de Qt/E
● Basée sur qmake (outils similaire à GNU/Autotools ou
CMake)
● Définition de l'environnement croisé dans le répertoire
mkspecs (GCC, etc.).
● Peu de différences entre Qt4 et Qt5
$ ./configure -embedded arm -xplatform qws/linux-arm-g++
$ ./configure -xplatform linux-arm-none-gnueabi-g++
$ make; make install
● Intégré à Buildroot et Yocto/OpenEmbedded → plus
simple
Qt5
Qt4
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Test de Qt4/QWS
● Compilation avec Buildroot
● Premier test possible avec Raspberry Pi ou QEMU
(LinuxFB / QWS)
$ make raspberrypi_qt4_defconfig
$ make qemu_arm_versatile_2630_qt4_defconfig
● Test avec QEMU
$ qemu-system-arm -M versatilepb -m 128 -kernel
zImage -initrd rootfs.cpio.gz -append "mem=128M"
● Nombreux programmes de test dans les répertoires
demos et examples
● Ne pas oublier l’option -qws !
# cd /usr/share/qt/examples/widgets
# ./analogclock/analogclock -qws
# ./wiggly/wiggly -qws
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Configuration des entrées
● On utilise en général un écran tactile → calibration
● L'écran tactile nécessite :
– Pilote noyau → /dev/input/eventX
– evtest → test d'événement « bas niveau »
– TSLIB → plugins pour les différents écrans + outil de
calibration ts_calibrate
● Exemple avec BB Black
# evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0: tps65217_pwr_but
/dev/input/event1: ti-tsc
/dev/input/event2: gpio_keys.13
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Configuration des entrées, suite
● Calibration par ts_calibrate
# export TSLIB_TSDEVICE=/dev/input/event1
# export TSLIB_FBDEVICE=/dev/fb1
# ts_calibrate
● Crée le fichier /etc/pointercal
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Utilisation avec Qt4/QWS
● On utilise quelques variables d'environnement
# export QWS_MOUSE_PROTO=tslib:/dev/input/event1
# export QWS_DISPLAY=linuxfb:/dev/fb1
# /usr/share/qt/examples/widgets/sliders/sliders -qws
● Suite sur :
http://doc.qt.digia.com/4.6/qt-embedded-envvars.html
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Qt/E, exemple Webkit
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Qt/E, exemple qtdemo
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Test Qt5/OpenGL (EGLFS)
● Construction avec Buildroot
$ make distclean
$ make raspberrypi_qt5_defconfig
$ make
● Test sur la carte RPi
# /usr/lib/qt/examples/gui/openglwindow/openglwindow
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Développement multi-plateforme
● Le même code source est utilisable sur les différentes
plateformes grâce à qmake
● Linux/X11
$ qmake && make
$ ./QThread_ex
● Linux/QWS
$ make distclean
$ export PATH=<BR path>/output/host/usr/bin:$PATH
$ qmake && make
...
# QThread_ex -qws
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Consommation mémoire
● LE point faible de Qt
● Consommation de l’exemple analogclock: 20 Mo
● Consommation de webkit: 50 Mo
● Consommation d’une démonstration DirectFB
(df_andi) : 2 Mo
● Qt est destiné au développement d’applications
« complexes »
● Amélioration dans Qt5 (?)
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Environnement de développement
● Qt est PLUS qu’un toolkit graphique !
● Abstraction pour sockets, threads, Unicode, SQL, ...
● Les objets dérivent de QObject mais ne sont pas
uniquement des objets graphiques, ex: QThread
● Les « signaux/slots » remplacent avantageusement les
callbacks
● Prise en compte I18N
● Chargement dynamique d’IHM
NOM
CLIENT
Qt pour Linux embarqué 6/2014
QtCreator
● Outil WYSIWYG de création d’interface
● IDE de développement semblable à Eclipse
– Edition du code
– Compilation (croisée)
– Mise au point (GDB)
● Les fichier d’IHM Qt (.ui) sont au format XML
● Permet de définir des cibles X11, embedded, etc.
NOM
CLIENT
Qt pour Linux embarqué 6/2014
QtCreator, suite
NOM
CLIENT
Qt pour Linux embarqué 6/2014
QtCreator, suite
Sélection SDK
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Signaux/slots
● Callback → un événement <=> une fonction
● Qt : Un signal (ex: clic bouton) est reçu par plusieurs
« slots » après connexion (voir exemple QThread_ex)
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Prise en compte I18N
● I18N = Internationalization
● Message extraits du code source (.cpp) → .ts (XML)
● Traduction avec Qt Linguist en compilé en .qm
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Qt Linguist
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Qt Quick
● Programmation dynamique d'interface basée sur le
langage QML (Qt Modeling/Meta Language)
● QML est basé sur JavaScript
● Intégré à QtCreator
● Intégrable au code Qt existant
● Fonctionnellement « semblable » à HTML5 ?
● Qt Quick 1.1 dans Qt4 (4.7 et plus)
● Qt Quick 2 dans Qt5 → optimisé pour OpenGL
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Comparaison QML 1/2
NOM
CLIENT
Qt pour Linux embarqué 6/2014
Bibliographie
● http://fr.slideshare.net/zblair/brief-introtoqt
● http://fr.slideshare.net/yinyunqiao/qt5
● http://fr.slideshare.net/thiagomacieira/qtprojectorg-and-
qt-5
● http://www.ics.com/blog/building-qt-and-qtwayland-
raspberry-pi
● http://doc-snapshot.qt-project.org/qt5-dev/embedded-
linux.html#eglfshttp://qt-project.org/doc

Qt4 et 5 pour Linux embarqué

  • 1.
    Qt 4 et5 pour Linux embarqué Pierre FICHEUX, pierre.ficheux@openwide.fr
  • 2.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Qt, histoire ● Première version publiée par Trolltech en 1996 → toolkit en C++ ● Développé pour X11, 2 développeurs au départ, fondateurs de Trolltech ● Outil multi-plateforme (Unix, Windows, MacOS) ● Connu grâce à KDE ! ● Qt2 en 2000 → Qtopia (PDA sous Linux « Zaurus » de SHARP) ● Jusqu’en 2008, double licence GPL/Propriétaire ● En 2008, achat par Nokia → LGPL ● Qt4 → + Symbian, WinCE, Maemo, ... ● En 2011 rapprochement Nokia / M$ → cédé à Digia en 2012 ● Sortie de Qt 5.0 fin 2012 (Digia)
  • 3.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Architecture Qt4
  • 4.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Architecture Qt4, suite
  • 5.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Qt5, quoi de neuf ? ● Plus de plate-formes supportées → mobile, Wayland ● Nouvelle architecture, modularité améliorée ● Plus de partage de code avec QPA (Qt Platform Abstraction) ● Empreinte mémoire plus faible ● Au niveau utilisateur, code compatible avec Qt 4 ● Contraintes matérielles plus importantes (accélération OpenGL) ● Qt Quick 2 ● Installation plus complexe sur cible embarquée « exotique »
  • 6.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 QtCore QtNetwork QtGui QtQml QtQuick QtMultiMedia QtTest QtSql QtWebkit Principaux modules Qt5 Partie IHM
  • 7.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 QPA (Qt platform abstraction) Win Mac Wayland SymbianX11 …Android QAccessible QFont QPainter QImageQOpenGL … QWindow QScreen QSurface QInputMethodQOpenGLContext Scene graph (in qtdeclarative) QBacki ngStor e QWidgetQtWebkitQtQuick2 QtQuick1 Qt5 / QtGui
  • 8.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Qt/Embedded architecture ● Basé par défaut sur le framebuffer de Linux (LinuxFB) ● Client/serveur → QWS = Qt Window System (supprimé en Qt5) ● Pas d'accélération matérielle ● Peut utiliser un framebuffer « virtuel » (X11) avec QVFb ● Une application serveur (-qws), les autres clientes ● Le serveur gère en général l’affichage mais l’application peut accéder directement à l’écran pour des raisons de performances ● Configuration par défaut pour l'embarqué « léger » → remplacé par X11 / OpenGL sur Qt5 (EGLFS)
  • 9.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Principe de QWS
  • 10.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Compilation de Qt/E ● Basée sur qmake (outils similaire à GNU/Autotools ou CMake) ● Définition de l'environnement croisé dans le répertoire mkspecs (GCC, etc.). ● Peu de différences entre Qt4 et Qt5 $ ./configure -embedded arm -xplatform qws/linux-arm-g++ $ ./configure -xplatform linux-arm-none-gnueabi-g++ $ make; make install ● Intégré à Buildroot et Yocto/OpenEmbedded → plus simple Qt5 Qt4
  • 11.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Test de Qt4/QWS ● Compilation avec Buildroot ● Premier test possible avec Raspberry Pi ou QEMU (LinuxFB / QWS) $ make raspberrypi_qt4_defconfig $ make qemu_arm_versatile_2630_qt4_defconfig ● Test avec QEMU $ qemu-system-arm -M versatilepb -m 128 -kernel zImage -initrd rootfs.cpio.gz -append "mem=128M" ● Nombreux programmes de test dans les répertoires demos et examples ● Ne pas oublier l’option -qws ! # cd /usr/share/qt/examples/widgets # ./analogclock/analogclock -qws # ./wiggly/wiggly -qws
  • 12.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Configuration des entrées ● On utilise en général un écran tactile → calibration ● L'écran tactile nécessite : – Pilote noyau → /dev/input/eventX – evtest → test d'événement « bas niveau » – TSLIB → plugins pour les différents écrans + outil de calibration ts_calibrate ● Exemple avec BB Black # evtest No device specified, trying to scan all of /dev/input/event* Available devices: /dev/input/event0: tps65217_pwr_but /dev/input/event1: ti-tsc /dev/input/event2: gpio_keys.13
  • 13.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Configuration des entrées, suite ● Calibration par ts_calibrate # export TSLIB_TSDEVICE=/dev/input/event1 # export TSLIB_FBDEVICE=/dev/fb1 # ts_calibrate ● Crée le fichier /etc/pointercal
  • 14.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Utilisation avec Qt4/QWS ● On utilise quelques variables d'environnement # export QWS_MOUSE_PROTO=tslib:/dev/input/event1 # export QWS_DISPLAY=linuxfb:/dev/fb1 # /usr/share/qt/examples/widgets/sliders/sliders -qws ● Suite sur : http://doc.qt.digia.com/4.6/qt-embedded-envvars.html
  • 15.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Qt/E, exemple Webkit
  • 16.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Qt/E, exemple qtdemo
  • 17.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Test Qt5/OpenGL (EGLFS) ● Construction avec Buildroot $ make distclean $ make raspberrypi_qt5_defconfig $ make ● Test sur la carte RPi # /usr/lib/qt/examples/gui/openglwindow/openglwindow
  • 18.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Développement multi-plateforme ● Le même code source est utilisable sur les différentes plateformes grâce à qmake ● Linux/X11 $ qmake && make $ ./QThread_ex ● Linux/QWS $ make distclean $ export PATH=<BR path>/output/host/usr/bin:$PATH $ qmake && make ... # QThread_ex -qws
  • 19.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Consommation mémoire ● LE point faible de Qt ● Consommation de l’exemple analogclock: 20 Mo ● Consommation de webkit: 50 Mo ● Consommation d’une démonstration DirectFB (df_andi) : 2 Mo ● Qt est destiné au développement d’applications « complexes » ● Amélioration dans Qt5 (?)
  • 20.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Environnement de développement ● Qt est PLUS qu’un toolkit graphique ! ● Abstraction pour sockets, threads, Unicode, SQL, ... ● Les objets dérivent de QObject mais ne sont pas uniquement des objets graphiques, ex: QThread ● Les « signaux/slots » remplacent avantageusement les callbacks ● Prise en compte I18N ● Chargement dynamique d’IHM
  • 21.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 QtCreator ● Outil WYSIWYG de création d’interface ● IDE de développement semblable à Eclipse – Edition du code – Compilation (croisée) – Mise au point (GDB) ● Les fichier d’IHM Qt (.ui) sont au format XML ● Permet de définir des cibles X11, embedded, etc.
  • 22.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 QtCreator, suite
  • 23.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 QtCreator, suite Sélection SDK
  • 24.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Signaux/slots ● Callback → un événement <=> une fonction ● Qt : Un signal (ex: clic bouton) est reçu par plusieurs « slots » après connexion (voir exemple QThread_ex)
  • 25.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Prise en compte I18N ● I18N = Internationalization ● Message extraits du code source (.cpp) → .ts (XML) ● Traduction avec Qt Linguist en compilé en .qm
  • 26.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Qt Linguist
  • 27.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Qt Quick ● Programmation dynamique d'interface basée sur le langage QML (Qt Modeling/Meta Language) ● QML est basé sur JavaScript ● Intégré à QtCreator ● Intégrable au code Qt existant ● Fonctionnellement « semblable » à HTML5 ? ● Qt Quick 1.1 dans Qt4 (4.7 et plus) ● Qt Quick 2 dans Qt5 → optimisé pour OpenGL
  • 28.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Comparaison QML 1/2
  • 29.
    NOM CLIENT Qt pour Linuxembarqué 6/2014 Bibliographie ● http://fr.slideshare.net/zblair/brief-introtoqt ● http://fr.slideshare.net/yinyunqiao/qt5 ● http://fr.slideshare.net/thiagomacieira/qtprojectorg-and- qt-5 ● http://www.ics.com/blog/building-qt-and-qtwayland- raspberry-pi ● http://doc-snapshot.qt-project.org/qt5-dev/embedded- linux.html#eglfshttp://qt-project.org/doc