In questi giorni sto studiando abbastanza approfonditamente le Qt e non vi nascondo che mi sto lentamente innamorando di questo framework. Già lo apprezzavo per molti motivi, ma più scendo nel dettaglio più scopro una certa “poesia ingegneristica”. Oggi però non sono qui per parlarvi delle QT, bensì del recente rilascio della nuova versione di Qt Creator.

Qt Creator 2 è l’ultima versione di un IDE multi-piattaforma dedicato alla programmazione in Qt. L’ambiente integra tutti i classici strumenti già noti ai programmatori Qt) in un unico ambiente integrato dotato di un editor, debug e interfacciamento ai più popolari sistemi di controllo di versione. Potete vedere un piccolo tour in questo video:

QtCreator integra un editor piuttosto avanzato.

La finestra dell'editor.

Anche QtDesigner è perfettamente integrato:

QtDesigner all'interno di QtCreator

E la documentazione completa del mondo Qt è accessibile con un semplice click.

QtAssistant in QtCreator

QtCreator è disponibile nei repository delle maggiori distribuzioni anche se, al momento, è disponibile solamente la versione 1.3. Se avete fretta e voglia potete provare la versione 2 scaricandola da qui. La versione per linux è facilmente installabile eseguendo il file .bin che scaricherete. Potete anche installare QtCreator in locale senza cioè sporcare il sistema con un installazione “non ufficiale”.

QtCreator non è attualmente all’altezza di altri colossi degli IDE quali Eclipse o Visual Studio, ma la strada imboccata da Nokia sembra proprio quella di creare una valida e completa alternativa. I presupposti ci sono tutti, non ci resta che aspettare. :)

 

Tempo fa parlai molto bene di Moblin. Ora, come molti  già sapranno, Moblin è un progetto praticamente morto e risorto con il nome di MeeGo. MeeGo è il frutto della partnership di Nokia e Intel per la creazione di un sistema operativo che si adatti a tutta una categoria di device: netbook, tablet, connected tv e molto altro. Il principale sistema grafico sono le Qt (di proprietà della Nokia), cosa che rende l’intera distribuzione più appetibile ai miei occhi.

Con il rilascio della versione 1.0, ancora molto cruda ma usabile, abbiamo potuto constatare come MeeGo ricalchi molto da vicino la grafica di Moblin. Tuttavia gira in rete il video della versione per tablet, molto zuccherosa, che mostra le principali caratteristiche del sistema facendo uso della tecnologia touch.

Questo video mi ha lasciato molto affascinato sia per la fluidità delle animazioni sia per l’ottimo approccio di usabilità (senza testarlo personalmente è un giudizio affrettato, ma per ora voglio sbilanciarmi). La domanda che più mi viene spontanea è: come mai tutta questa differenza grafica fra la versione Netbook e quella tablet? Che verrà aggiornata anche la prima? Non lo so. Per ora bisogna aspettare.

Nel frattempo, chi volesse dilettarsi nella scrittura di applicazioni per MeeGo può già trovare SDK e tools di sviluppo all’interno della nuova versione di Qt Creator. Spero che questo video abbia fatto venire l’acquolina in bocca anche a voi.

 

Molti conosceranno sicuramente le Librerie QT: esse sono infatti il principale tool-kit grafico della suite desktop KDE nonché di molti altre applicazioni e sistemi embedded. In quanto tali, quando si parla di Qt, molti pensano ad esse solamente come mere librerie grafiche, in realtà, tali librerie vanno ben oltre la semplice gestione e visualizzazione di finestre e widget: esse sono infatti una libreria che racchiude un gran numero di layer che semplificano lo sviluppo software in generale. In questo breve articolo infatti mostrerò uno dei tanti modi in cui l’uso delle librerie può Qt semplificare la vita agli sviluppatori: il meccanismo Meta-Object System (moc) e l’accoppiata signals e slots.
Segnali (signals) e slot (slots) sono due elementi fondamentali della programmazione con le Qt. Essi permettono di legare insieme due oggetti senza che nessuno dei due sappia nulla dell’altro. È possibile, ad esempio, costruire due classi A e B e fare in modo che ad un evento di A corrisponda un azione di B e viceversa senza doversi minimamente preoccupare di inserire in A riferimenti di B (e rispettivamente in B riferimenti ad A).
Un segnale è infatti un avviso emesso da un oggetto al verificarsi di determinate condizioni. Ad ogni segnale è collegato uno slot che non è nulla di diverso da una comune funzione C/C++: non appena è emesso il segnale X viene automaticamente eseguita la funzione Y.
Per collegare un segnale ad uno slot si usa il comando

connect(sendre, SIGNAL(signal), receiver, SLOT(slot));

dove sender e receiver sono puntatori a due oggetti (oggetti “qt” per la precisione) e signal e slot non sono altro che dichiarazioni di funzioni senza il nome dei parametri. Possiamo avere varie forme di connessioni:
  • PIÙ SEGNALI COLLEGATI AD UN SOLO SLOT. In questo caso la stessa funzione viene lanciata in corrispondenza di due o più segnali differenti.
  • UN SOLO SEGNALE COLLEGATO A PIÙ SLOT. Viceversa, in questo caso, l’arrivo di un segnale avvia l’esecuzione di più funzioni. Tali funzioni vengono eseguite una dopo l’altra in un ordine indefinito (fate quindi molta attenzione alla sincronizzazione di tali funzioni).
  • UN SEGNALE COLLEGATO AD UN SEGNALE. In questo caso l’arrivo di un segnale causa semplicemente il lancio di un nuovo segnale (che può essere la propagazione del primo o un segnale del tutto diverso).

“Fantastico!” direte voi, ma cosa è necessario per poter usufruire di tale meraviglia? La cosa è ancora più semplice. Il primo requisito è che sia gli oggetti che lanciano e ricevono segnali sia quelli che definiscono gli slot  ereditino dalla classe QObject e definiscano al loro interno la macro Q_OBJECT. Secondo, quando connettiamo un segnale ad uno slot dobbiamo assicurarci che contengano lo stesso numero di parametri, dello stesso tipo e nello stesso ordine. Se le nostre classi rispondono a questi due requisiti siamo pronti ad utilizzare segnali e slot.

Questo meccanismo è usato massicciamente nello sviluppo di applicazioni grafiche in Qt, tuttavia possiamo vedere dall’esempio seguente come esso possa essere applicato in classi che non hanno nulla a che vedere con il lato “grafico” delle Qt.
class Impiegato : public QObject {
    Q_OBJECT
    public:
        Impiegato() { miosalario = 0; }
        int salario() const { return miosalario; }
    public slots:
        void setSalario(int nuovo);
    signals:
        void salarioCambiato(int nuovo);
    private:
        int miosalario;
};

void Impiegato::setSalario(int nuovo) {
    if (nuovo != miosalario) {
        miosalario = nuovo;
        emit salarioCambiato(miosalario);
    }
}
Da questo stralcio di codice possiamo ricavare due osservazioni interessanti. La prima è che le funzioni slot sono del tutto identiche a classiche funzioni C++ e questo significa che possono tranquillamente essere invocate nel modo tradizionale. Il secondo punto è l’introduzione di alcune nuove parole chiave come signals, slots e emit. Queste parole chiave in realtà non sono altro che macro definite nella libreria Qt ma che svolgono un ruolo molto importante nel Meta-Object System.
Un altra cosa che è bene precisare è l’implementazione di setSalario: essa è infatti progettata in modo tale da cambiare solamente se nuovo è diverso da miosalario in modo tale da evitare che si cada in un ciclo infinito in caso di connessione ciclica (ad esempio connettere il segnale salarioCambiato ad un istanza di Impiegato).
L’uso di questo meccanismo crea però un anello in più nella fase di compilazione. Per assicurare che il processo moc vada a buon fine è necessario generare il file di compilazione (makefile) tramita un applicazione ad-hoc: qmake. L’uso di qmake è eccessivamente semplice quindi non approfondirò l’uso di questo tool.
A questo punto avete a disposizione uno strumento meravigliosamente efficiente per la comunicazione fra oggetti della vostra applicazione, sia essa con interfaccia grafica sia senza. Non vi resta che approfondire questa tecnologia con qualche manciata di tutorial.

 

qtTempo fa vi segnalai che stavo  preparando una guida a Qt e Python. Poi è stato aperto Qt-Italia.org. Ho quindi deciso di collaborare direttamente con il  progetto e quindi, inserirò tutto il materiale sulle Qt all’interno del portale. Ovviamente, inserirò periodicamente anche qualcosa qui :)

Il portale è nuovo ed esce da poco da una riorganizzazione generale del CMS. Tuttavia, ad ora, tutto sembra in ordine e quindi vi suggerisco di visitare il sito e iscrivervi al relativo forum.

Se amate le Qt o volete semplicemente farvi un idea delle loro potenzialità avete trovato il posto giusto.

 

TV HeadGuardare le Tv e le Radio in streaming è sempre un problema, vuoi che richiedono plugin particolari, vuoi che Moonligth sta sempre cento passi dietro alla versione di Silverligth per Windows… fatto sta che non funziona mai niente. I più astuti di noi riescono a ricavarsi l’indirizzo del flusso web e a guardarselo con VLC. Ma i nuovi utenti smadonnano ferocemente. E li capisco.

Così da qualche tempo era uscito un piccolo progetto amatoriale in bash per automatizzare questo processo. Il progetto in questione è Tv-Player. Poiché conosciamo tutti i limiti del bash mi sono incaricato di cotattare le persone che mantenevano questo progetto per proporgli una conversione totale in Python+Qt.

Posso annunciare fieramente che il progetto originale è appena stato portato interamente in Qt. Inoltre sto sviluppando un altra funzionalità molto carina che permetterà di avere una lista di tv e radio sempre aggiornata. Infatti la lista degli indirizzi non sarà più locale, ma remota e gestita dai ragazzi del team.

In pratica il programma si incarica di scaricare automaticamente l’ultima versione aggiornata della suddetta lista.

Tutto qua.

Se siete interessati al progetto andate pure numerosi a visitare il sito! :D

Foto by SilentAwakening on DeviantArt

 

qtVerrei farvi un regalo apprezzato. Mettere in piedi un’altra serie di guide oltre alle altre due principali (GAPG e Scheme) rischia di essere un azzardo. Ma, dato che sicuramente da febbraio avrò moolto tempo libero e che “parallelizzare un processo porta quasi sempre benefici” ho deciso di preparare una “mini serie” sulla programmazione grafica e in particolare all’uso di Qt e Python.

PERCHÉ QT?

Le Qt, dal mio punto di vista, sono nettamente superiori alle Gtk per semplicità di uso, completezza, resa grafica e strumentazione. Inoltre le so usare molto meglio delle Gtk e quindi non rischio di dire troppe boiate. Terzo punto, le Qt sono stra-mega portabili e quindi questa guida può essere facilmente seguita anche da sviluppatori Win.

PERCHÉ PYTHON?

Le Qt sono nativamente scritte in C++ per ovvi motivi. Esistono wrapper per parecchi linguaggi ma, fra tutti, quello meglio riuscito è sicuramente quello per Python. Quindi, per non dovermi concentrare troppo su argomenti troppo tecnici ed estranei alle Qt di cui sarei costretto a parlare se usassi C++, ho scelto Python. Inoltre Python è facile ed è uno dei linguaggi di programmazione con cui molti nuovi arrivati cominciano a programmare.

Python è la scelta adatta. Inoltre da python vi sarà semplice passare al C++ in quanto sia i nomi delle classi Qt, sia i dati con cui lavoro sono pressocché identici.

REQUISITI

I requisiti per la guida sono:

  • Conoscenza di Python a livello medio o medio-basso (ovvero conoscere tutti i costrutti base tipo if, for, def, while, liste, dizionari, tuple, etc…)
  • Familiarità con la programmazione a oggetti.
  • Familiarità con il terminale.
  • Cenni di Makefile.
  • Cenni di bash.

STRUMENTI

Presenterò gli strumenti man mano che ci serviranno. Tuttavia la dotazione base che utilizzarò io sarà:

  • KDevelop (o un qualsiasi altro editor/IDE)
  • PyUIC4
  • Qt-Designer
  • PyLint

Oltre ad altre varie ed eventuali.

COSA TRATTEREMO

Gli argomenti si dislocheranno fra:

  • Esempio di primo programma in Qt.
  • Presentazione dell’architettura della libreria Qt.
  • Presentazione di alcuni Widget comuni.
  • I Layout.
  • Gestione degli Eventi
  • I widget personalizzati

Più altre cose che ancora non ho deciso. Ci metterò un po ad organizzarmi per bene il discorso.

CONCLUSIONI

Alla fine delle guida saprete costruirvi delle interfaccie più o meno complesse. Ovviamente non posso insegnarvi il senso estetico ma quello non mi sembra importante per ora. :D

Datemi qualche feedback. Se ci sono persone interessate comincio lo sviluppo altrimenti lo lascio nella lista delle cose pendenti. :D

© 2008-2012 SlashCode Suffusion theme by Sayontan Sinha