Questo talk presenterà l'architettura di QPA (ex Lighthouse Project) e come questo consente agli sviluppatori di portare facilmente Qt su sistemi diversi.
2. Il problema
Qt4 era un framework per lo sviluppo di Gui cross-
platform, ma i suoi internals contenevano molto codice
specifico di una piattaforma o di un'altra.
#if defined (Q_WS_X11)
…
#elif defined (Q_WS_MAC)
…
#elif defined (Q_WS_WIN)
…
In quella situazione c'era un sacco di codice duplicato
ed era molto complicato fare un nuovo port di Qt.
2
3. La nascita di Lighthouse
Cos'era Lighthouse:
un esperimento dei Qt Labs, un nuovo port di Qt
Il successore di Qt per embedded linux (QWS),
molto potente ma scomodo
un set di API ben definito per rendere QtGui
window system agnostic
3
4. Qt Platform Abstraction
Lighthouse integrato in Qt 4.8 → Qt Platform Abstraction
QWS (Qt Window System) vs QPA
QWS QPA
Plugin API per realizzare il
Si, ma complesso Si
proprio Qt port
Windowing system Si Esterno
OpenGL Si, ma con limitazioni Si
4
5. Qt Abstraction Platform
QPA implementa un set di API, utilizzabile mediante la
scrittura di plugin, che implementano l'interfaccia
QplatformIntegration
Principali plugin disponibili in Qt 4.8:
directfb
linuxfb
minimal
qvfb
vnc
wayland
xcb
5
6. QPlatformIntegration
Classe factory → costruisce le classi che implementano
le funzionalità richieste dal codice (cross-platform) Qt
6
8. QPlatformIntegration: le classi
QPlatformScreen → rappresenta lo schermo vero e
proprio e ne gestisce l'eventuale inizializzazione
QPlatformWindow → è la rappresentazione della finestra
stessa e l'interfaccia con il window manager
QWindowSurface → gestisce il contenuto della finestra e
il disegno vero e proprio
8
9. QPlatformIntegration: le classi
QPixmapData → rappresenta l'implementazione di una
QPixmap e contiene i dati veri e propri
Alcune specializzazioni già disponibili:
QRasterPixmapData, QGlPixmapData,
QBlittablePixmapData
QPlatformFontDatabase → è l'interfaccia per il font
database della propria piattaforma
Alcune specializzazioni già pronte:
QFontconfigDatabase,
QBasicUnixFontDatabase,
QGenericUnixFontDatabase
9
10. Un esempio “minimale”
Plugin minimal
Mostra quale è il minimo quantitativo di codice
necessario per scrivere un plugin per QPA
Reimplementa QPlatformScreen e
QWindowSurface per scrivere pixel su
un'immagine
10
11. QWindowSystemInterface
Classe che copre l'altra direzione: piattaforma → Qt
E' composta da una serie di funzioni statiche threadsafe
che possono essere chiamate dal proprio plugin per
QPA
Gestisce i vari eventi provenienti dal sistema:
Mouse, tastiera, touchscreen
Window close/enter/leave/...
...
11
12. Nuove piattaforme
iOs
uikit → plugin proof of concept per qpa
Ufficialmente non sarà supportato, e a causa di
problemi di licenza e deploy probabilmente non
sarà mai un porting completo
Android
Non ufficialmente supportato ma ha le
potenzialità per divenire un porting completo
Necessitas → progetto esterno che porta Qt su
Android fornendo anche un ambiente di
sviluppo completo
12
13. Nuove piattaforme
Google Native Client
Progetto sperimentale (al momento) che porta le
Qt all'interno di Chrome/Chromium
http://developer.qt.nokia.com/wiki/Qt_for_Google
_Native_Client
13