ingallosbaraglio - l'informatica in soldoni

Le librerie Qt



Pubblicato il 26-11-2012

Panoramica sulle librerie Qt

In programmazione, Qt è una libreria multipiattaforma per lo sviluppo di programmi con interfaccia grafica tramite l'uso di widget (congegni o elementi grafici). Qt, ampiamente utilizzato nell'ambiente desktop KDE, viene sviluppato dall'azienda Qt Software (meglio conosciuta come Trolltech o Quasar Technologies).

Qt usa il linguaggio C++ standard con un estensivo uso del preprocessore C per arrichire il linguaggio, ma esistono interfacce per Java, Python, C, Perl e PHP.

Gira sulle piattaforme principali ed integra funzioni per l'accesso ai database SQL, parsing di documenti XML ed API multipiattaforma per l'uso dei file.

Le librerie sono disponibili per le seguenti piattaforme:
Qt/X11 — Qt per X Window System;
Qt/Mac — Qt per Mac OS X di Apple;
Qt/Windows — Qt per Microsoft Windows;
Qt/Embedded — Qt per piattaforme embedded (palmari e simili).

Attualmente vengono offerte in quattro edizioni, disponibili per ciascuna delle piattaforme:
Qt Console — versione embedded per lo sviluppo senza interfaccia grafica;
Qt Desktop Light — versione base per applicazioni con interfaccia grafica, senza supporto rete e SQL;
Qt Desktop — la versione completa;
Qt Open Source Edition — la versione completa, per sviluppo di software libero.

Le prime tre versioni sono rilasciate sotto licenza commerciale; la versione libera, invece, viene rilasciata sotto licenza GPL. A partire da Qt 4 inoltre viene rilasciato sotto doppia licenza (GPL e commerciale) anche su Windows.

L'edizione commerciale per Windows supporta Visual Studio; tutte supportano comunque il compilatore C++ GCC.

La squadra di KDE ha anche rilasciato un'edizione di Qt, chiamata Qt/Windows Free Edition — basata sul codice sorgente della versione Qt/X11 e licenziata sotto GPL, viene rilasciata per il progetto KDE via Cygwin. Questo era stato ispirato dal fatto che le versioni di Qt precedenti alla 4.0 non erano disponibili come software libero sotto Windows.



Breve storia...non fa mai male

Haavard Nord e Eirik Chambe-Eng (rispettivamente lo sviluppatore originale di Qt al CEO e il presidente della Trolltech) iniziarono lo sviluppo di "Qt" nel 1991. Tre anni prima la società era stata fondata come Quasar Technologies, poi cambiò il nome in Troll Tech, e infine in Trolltech.

Il toolkit fu chiamato Qt perché la lettera Q appariva bella nel carattere di Emacs Haavard, e la T fu ispirata dal Xt, il tool X. Un altro fattore può essere stato che la lettera Q non viene usata in norvegese, che sostituisce sistematicamente kv- a qu- in tutte le parole (in accordo con l'effettiva pronuncia): ciò rende la lettera Q "esotica", un po' come la K in italiano.

In norvegese, l'acronimo Qt si pronuncia cü-té: in grafia norvegese, potrebbe scriversi "kute", e, per quanto strano, è una parola composta che significa "tè di mucca".

Struttura delle librerie Qt

Le librerie Qt, appoggiandosi al linguaggio di programmazione C++, traggono da esso tutti i benefici della programmazione ad oggetti e contribuiscono a migliorare l'ambiente di sviluppo offrendo dei meccanismi che ne aumentano sensibilmente la flessibilità.

Le Qt aggiungono al C++ le seguenti caratteristiche:
• Un potente meccanismo per la comunicazione tra oggetti chiamato signal/slot.
• Un'estrema personalizzazione degli oggetti.
• Un efficiente sistema di eventi.
• Il supporto per l'internazionalizzazione.
• Una strutturazione degli oggetti seguendo una gerarchia ad albero che permette di gestire le componenti della GUI in maniera efficiente utilizzando il concetto di dipendenza padrefiglio, in moto tale che eliminando il primo venga distrutto automaticamente anche il secondo.
• Una migliore gestione dei puntatori tramite la classe QPointer la quale elimina la presenza di puntatori pendenti, settando a 0 quelli che si riferiscono ad oggetti ormai andati distrutti.

Molte di queste caratteristiche, sono implementate con tecniche standard del C++, altre, come il meccanismo di comunicazione signal/slot, richiedono uno strumento di compilazione esterno che viene fornito dalle Qt sotto il nome di Meta-Object Compiler (MOC).

Un altro dei punti cardine del successo delle librerie Qt è la loro facilità di utilizzo. Vediamo di seguito quali sono i sei più importanti principi che delle buone API devono tenere di conto e che i programmatori delle Qt hanno fin da subito cercato di raggiungere.

Un'API sta al programmatore come una GUI sta all'utente finale.

La 'P' in API sta per “Programmatore” non per “Programma”, ciò sottolinea il fatto che le API vengono usate dai programmatori, che fino a prova contraria sono degli esseri umani.

A questo proposito delle corrette librerie devono:
Essere minimali: poche classi e pochi metodi pubblici.
Essere complete: supporto alle funzionalità richieste dai programmatori.
Avere semantiche chiare e semplici: evitare l'uso di soluzioni troppo generiche che renderebbero la comprensione delle librerie più ardua.
Essere intuitive: comprensibili anche ai meno esperti.
Essere facili da memorizzare: dare nomi chiari, precisi e intuitivi ai componenti della libreria.
Rendere il codice leggibile.

Vediamo ora quali sono alcuni degli accorgimenti che i programmatori delle Qt hanno utilizzato per soddisfare i sei principi sopra enunciati.

Polimorfismo Statico

Classi simili dovrebbero avere API simili, questo è in breve il concetto di polimorfismo statico. Ciò può essere ottenuto usando l'ereditarietà quando ha senso usarla oppure durante la fase di design delle librerie.

Il polimorfismo statico semplifica il lavoro dei programmatori, consentendo una memorizzazione più semplice delle API e degli altri schemi di programmazione, inoltre riduce il numero delle classi pubbliche e permette agli utenti finali di consultare con facilità la documentazione.

I programmatori delle Qt hanno ampiamente utilizzato il polimorfismo ove possibile, ne sono una prova le classi QString e QByteArray le quali hanno molte funzioni simili, come ad esempio:
append, permette di inserire un testo o un byte, a seconda della classe chiamante, alla fine dell'oggetto che la invoca.
at, permette di ricavare il carattere o byte corrispondente alla posizione i-esima specificata come argomento.
capacity, ritorna il numero massimo di caratteri (o byte) salvabili senza utilizzare la riallocazione.
contains, ritorna un valore booleano a seconda dell'effettiva prensenza del carattere specificato in ingresso.
clear, pulisce l'oggetto che la invoca.
count, restituisce il numero di caratteri (o byte) dell'oggetto chiamante.
insert, inserisce un carattere in una posizione, entrambe specificate in argomento.
isEmpty, ritorna il valore true se la dimensione dell'oggeto è 0 o false viceversa.

Questo tipo di scelta, permette di rendere il codice altamente manutenibile, se infatti, per un qualsiasi motivo, volessimo cambiare una QString in un QByteArray, non dovremmo effettuare stravolgimenti del codice.

In definitiva i programmi che sfruttano queste classi polimorfiche sono automaticamente estensibili in quanto indipendenti dal tipo di oggetti che trattano.

Il Sistema degli Eventi

Le applicazioni GUI vengono definite applicazioni di tipo “event-driven”, ovvero pilotate dagli eventi; questa definizione è davvero rappresentativa, in quanto in un'applicazione GUI, tutto ciò che succede è il risultato di un evento.

Nelle librerie Qt, gli eventi sono oggetti che derivano dalla classe astratta QEvent e possono essere gestiti da una qualsiasi sottoclasse di QObject.

Quando programmiamo con le Qt, raramente abbiamo bisogno di preoccuparci del meccanismo degli eventi, poiché i widget che usiamo emettono in automatico dei segnali nel momento in cui avviene qualcosa di significativo. La gestione degli eventi diventa quindi importante nel momento in cui vogliamo scrivere dei widget personalizzati o vogliamo modificarne il comportamento di quelli già esistenti.

Esistono molte tipologie di eventi, ciascuno dei quali viene gestito da una classe specifica, in particolare alcune di queste classi sono: QMouseEvent e QKeyEvent; ciascuna possiede vari metodi che gestiscono un evento particolare, ad esempio QMouseEvent supporta la pressione di un pulsante del mouse, il doppio click, il movimento e altre operazioni simili.

Signal/Slot

Gli oggetti Qt comunicano tra loro mediante un flessibile meccanismo chiamato signal/slot, il quale costituisce una delle più importanti novità inserite all'interno di queste librerie rispetto agli altri frameworks esistenti.

Un signal è un metodo che viene emesso da un oggetto il cui stato interno è cambiato, mediante la parola chiave emit, quando lo si ritiene opportuno. Essi non vengono implementati ma solo dichiarati e vanno inseriti, all’interno della classe, nella sezione signals.

Uno slot è una normale funzione del C++ che va inserita nelle sezioni public slots, protected slots o private slot; essa può essere invocata direttamente o, senza tenere di conto del proprio livello di accesso, tramite una connessione signal – slot.

Le connessioni tra signal e slot sono di tipo n a n, ovvero è possibile connettere un segnale a più slot e un solo slot può essere avviato da più segnali. Nel caso in cui più slot sono collegati ad uno stesso segnale, verranno eseguiti uno dopo l'altro, nello stesso ordine in cui sono connessi, quando il segnale viene emesso.

Risorse in Rete

Per approfondire i concetti fin'ora esposti vi rimando ai seguenti link:
Wikipedia.
TrollTech.
Qt Gitorius.
Qt Italia.
Sito ufficiale del progetto Qt.
The art of building Qt Applications.

Condividi