Programmare con Qt4 - quellidiinformatica.org · tramite QtJambi che permette di usare Java...
Transcript of Programmare con Qt4 - quellidiinformatica.org · tramite QtJambi che permette di usare Java...
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
1/
Programmare con Qt4
Ing. Giovanni VenturiRoma, 27 ottobre 2007 - Linux Day
rilasciato con Creative Commons Attribuzione-Non commerciale-Condividi allo stesso modo 2.5 Italia License
Immagine
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
2/
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
3/
Cosa sono le Qt?Cosa sono le Qt?
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
4/
Cosa sono le Qt?
Le librerie Qt sono una struttura multipiattaforma e completa per lo sviluppo di applicazioni in C++.
Costituiscono la componente base su cui si poggia KDE per la realizzazione di pulsanti e finestre.
Sono sviluppate dalla Trolltech, azienda Norvegese che ha stretto un accordo con KDE per permetterne l'uso anche se le Qt non erano rilasciate ancora con licenza GPL: www.trolltech.com .
Il 30 ottobre 2000 la Trolltech rilascia le Qt 2.2 anche con licenza GPL.
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
5/
Perché dovrei usare le Qt?Perché dovrei usare le Qt?
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
6/
Perché dovrei usare le Qt?
Perché le Qt sono librerie multipiattaforma disponibili per:GNU/Linux;FreeBSD, OpenBSD, NetBSD;Windows (sia per XP che per Vista);Mac Os X;per UNIX vari;
Si riduce il costo per lo sviluppo essendo il codice utilizzabile nell'immediato sulle diverse piattaforme. Utilizza la potenza del C++ con un elevato numero di API e librerie già pronte per ogni esigenza.
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
7/
E Java?E Java?
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
8/
E Java?
Molto spesso quando si parla di linguaggio multipiattaforma subito si pensa a Java della Sun Microsystem.
Le Qt sono ora disponibili anche per:Java Standard Edition 5.0Java Enterprise Edition 5.0
tramite QtJambi che permette di usare Java sfruttando i vantaggi delle caratteristiche delle Qt.
Per informazioni:http://dot.kde.org/1154086784/
http://doc.trolltech.com/qtjambi-1.0/qtjambi-index.html
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
9/
Via coi preparativiVia coi preparativi
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
10/
Qt 4.4Qt 4.4
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
11/
Qt 4.4
La versione di queste librerie è ancora in sviluppo, ma si promette:
Supporto alla multimedialità (tramite Phonon di KDE 4)WebKit (per il rendering di pagine HTML come widget)Funzionamento su PDA con Windows CEe molto altro
Qt 5
Non ci sono progetti per questa versione. Le Qt 4.x saranno a lungo sul mercato e permetteranno grandi evoluzioni.
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
12/
Innanzitutto...
... bisogna procurarsi le librerie Qt e compilarle. Utilizzeremo le qt-copy dall'SVN di KDE con le patch per KDE. La presenza di DBUS nel sistema su cui si installa Qt permetterà di comprendere anche il modulo QtDBus.
export QTDIR=~/qt-copyexport PATH=$QTDIR/bin:$PATHexport QMAKESPEC=linux-g++export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHcdsvn co svn://anonsvn.kde.org/home/kde/trunk/qt-copycd $QTDIR./apply_patches./configure -qt-gif -no-exceptions -debug -fast -prefix $QTDIR -confirm-licensemake
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
13/
Documentazione
Una volta compilate le librerie, saranno disponibili all'uso per la creazione della nostra prima applicazione.
La cosa interessante per chi non le ha mai utilizzate è che sono ben documentate, infatti proprio nei file scaricati da SVN (come anche dai sorgenti scaricabili dal sito della Trolltech) troveremo la documentazione completa i HTML nella directory ~/qt-copy/doc/htmlI file di SVN trunk sono relativi alla versione 4.3.2 di Qt.
In tale documentazione c'è la descrizione di tutti i metodi utilizzabili in tutte le classi C++ di Qt, con in più tanti esempi e tutorial per imparare.
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
14/
Qt assistantQt assistant
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
15/
Qt assistant
La documentazione sulle Qt è davvero tanta. Ci sono informazioni complete su:
membrisignalslot
disponibili per ogni singola classe di Qt. Vi sono molti esempi di programmazione Qt, tutorial vari su argomenti avanzati (SQL, Thread, ...) e tanto altro.
In più vi è il Qt assistant che è una applicazione che permette di ricercare la documentazione richiesta, stamparla, accedere alle sottosezioni varie: designer, linguistic e qmake.
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
16/
Un primo esempioUn primo esempio
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
17/
Un primo esempiomain.cpp...
#include <QApplication>#include <QPushButton>
int main(int argc, char *argv[]){ QApplication app(argc, argv);
QPushButton hello("Hello world!"); hello.resize(100, 30);
hello.show(); return app.exec();}
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
18/
Il codicegli #include...
#include <QApplication>
include la definizione della classe QApplication. Ogni GUI ha un solo oggetto di tipo QApplication che gestisce varie risorse come font e cursore predefiniti
#include <QPushButton>
include la definizione della classe QPushButton che è usata per definire nella GUI un pulsante che l'utente può premere e rilasciare. La classe ne gestisce l'aspetto come per ogni QWidget.
Un elemento di QPushButton può mostrare sia testo che icone (classe QIcon).
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
19/
Il codiceil main...
int main(int argc, char *argv[])
QApplication app(argc, argv); istanzia la GUI per poter aggiungere i vari elementi
QPushButton hello("Hello world!"); crea il pulsante con del testo
hello.resize(100, 30); ridimensiona lo stesso
hello.show(); rende visbile la GUI (nessuna GUI creata lo è)
return app.exec(); riceve e processa gli eventi di sistema e di utentelegandoli agli appositi elementi della GUI
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
20/
Compiliamo ed eseguiamo il codice
Creando main.cpp nella directory ld-01. Basta dare i comandi:qmake -projectqmake
Il primo crea il file ld-01.pro e il secondo il file Makefile. Per compilare il codice (main.cpp) si esegue il classico:
make
A questo punto ./ld-01 esegue l'applicazione.
Ma cosa succede? Perché il pulsante non reagisce ai clic?
Non è stata definita una corrispondente azione per il clic.
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
21/
Secondo esempioSecondo esempio
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
22/
Secondo esempiomain.cpp...
#include <QApplication>#include <QFont>#include <QPushButton>
int main(int argc, char *argv[]){ QApplication app(argc, argv); QPushButton quit("Esci!"); quit.resize(75, 30); quit.setFont(QFont("Courier", 18, QFont::Bold)); QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));
quit.show(); return app.exec();}
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
23/
Il codicegli #include...
Agli #include precedenti si aggiunge:#include <QFont>
che aggiunge la definizione della classe QFont per poter cambiare il font usato nel testo del pulsante utilizzato
quit.setFont(QFont("Courier", 18, QFont::Bold));è utilizzato per impostare il font Courier, con dimensione 18 in grassetto
QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));serve per legare l'azione del clic con la corrispondente azione ti terminazione della GUI.
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
24/
Segnali e slotSegnali e slot
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
25/
Segnali e slot
In ogni applicazioni GUI creata con Qt si utilizzerà il concetto diSIGNAL/SLOT
ovvero gli oggetti Qt possono comunicare tra di loro per il verificarsi di eventi: il clic su un pulsante, la modifica del valore di un oggetto come uno slider
Un oggetto emette un SIGNAL e un'altro oggetto lo intercetta eseguendo lo SLOT corrispondente. Tale corrispondenza nell'esempio precedente era stata definita dalla riga:
QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
26/
Schema SIGNAL/SLOT
L'emissione del segnale signal1 per l'oggetto Object1 produce l'esecuzione dello slot slot1 nell'oggetto Object2 e dello slot slot2 nell'oggetto Object2
e così via...
l'emissione può essere implicita o esplicita.
Implicita se si verifica un evento che produce il segnale
Esplicita se si invoca l'emissione del segnale tramite emit nomesegnale
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
27/
Alcune proprietà di SIGNAL/SLOT
Per utilizzare un meccanismo di SIGNAL/SLOT la classe deve ereditare dalla classe QObject o da QWidget
Classi come QPushButton, QLabel, QCheckBox, QRadioButton, ... ereditano da dette classi, quindi tale meccanismo è già utilizzabile
I parametri che si possono usare nei signal e negli slot per un oggetto personalizzato possono essere dei tipi desiderati e in un numero desiderato, naturalmente devo corrispondere
Un signal può anche invocare un altro signal che a sua volta eseguirà lo slot corrispondente
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
28/
Esempio di SIGNAL/SLOT - parte 1
Ecco la dichiarazione di una classe minimale C++ senza il meccanismo del signal/slot:
class Counter{ public: Counter() { m_value = 0; }
int value() const { return m_value; } void setValue(int value);
private: int m_value;};
Per usare signal/slot basta modificare...
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
29/
Esempio di SIGNAL/SLOT - parte 2
#include <QObject>
class Counter : public QObject { Q_OBJECT
public: Counter() { m_value = 0; }
int value() const { return m_value; }
public slots: void setValue(int value);
signals: void valueChanged(int newValue);
private: int m_value; };
Q_OBJECT serve per poter dichiare signal e slot e deve essere presente all'inizio, inoltre la classe deve ereditare da QObject
public slots: dichiara gli slot pubblici della classe
signals: dichiara i signal disponibili
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
30/
Esempio di SIGNAL/SLOT - parte 3
Ecco l'implementazione dello slot:void Counter::setValue(int value) { if (value != m_value) { m_value = value; emit valueChanged(value); }}
Ed ecco il codice che utilizzerà il meccanismo:
Counter a, b; QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));
a.setValue(12); // a.value() == 12, b.value() == 12 b.setValue(48); // a.value() == 12, b.value() == 48
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
31/
Esempio di SIGNAL/SLOT - parte 4
Ecco l'implementazione dello slot:void Counter::setValue(int value) { if (value != m_value) { m_value = value; emit valueChanged(value); }}
Ed ecco il codice che utilizzerà il meccanismo:
Counter a, b; QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));
a.setValue(12); // a.value() == 12, b.value() == 12 b.setValue(48); // a.value() == 12, b.value() == 48
ImportanteSi è aggiunta la condizione (value != m_value) per evitare un ciclo infinito nel caso in cui si imposta anche la connessione:
QObject::connect(&b, SIGNAL(valueChanged(int)), &a, SLOT(setValue(int)));
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
32/
Qt designerQt designer
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
33/
Qt designer
Quando si programma con Qt, si realizzano elementi grafici, quindi se per qualche motivo si desidera accellera il processo di scrittura del codice è possibile utilizzare uno strumento visuale che pemette di aggiungere gli elementi grafici con qualche clic.
Tale strumento visuale è il Qt designer.
Questo realizza un file con estenzione UI, che altro non è che un file XML che contiene la descrizione del form grafico realizzato.
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
34/
Come integrare nel codiceCome integrare nel codiceil form del Qt designer?il form del Qt designer?
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
35/
Integrazione nel codice del form realizzato con lo strumento Qt designer
Dopo aver realizzato un form con il Qt designer viene naturale chiedersi come avvenga l'operazione di integrazione con del codice "complesso".
Questa risposta è presente nella documentazione accessibile con il comodo Qt assistant (Using a Component in Your Application). Si possono usare tre metodi:
. The Direct Approach
. The Single Inheritance Approach
. Automatic Connections
Si analizza il caso semplice dell'approccio diretto. Per gli altri riferirsi all'esauriente documentazione.
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
36/
Approccio direttoApproccio diretto
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
37/
Integrazione nel codice con approccio diretto
Dopo aver realizzato un form con il Qt designer si integra il form in maniera molto semplice nel codice procedendo come segue.
I sorgenti dell'applicazione consistono di due file: main.cpp e form.ui .Si scrive il file .pro come segue:
TEMPLATE = appFORMS = form.uiSOURCES= main.cpp
Il parametro FORMS dice a qmake quale file deve essere processato da uic. In questo caso il file form.ui è utilizzato per creare il file ui_form.h che può essere usato da qualunche file in SOURCES.
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
38/
Integrazione nel codice con approccio diretto
Per essere certi che qmake genererà il file ui_form.h, bisogna includerlo in un file elencato in SOURCES.
Dal momento che main.cpp è l'unico file allora lo si includerà lì avendo quindi:
#include "ui_form.h"#include <QApplication>
Con questo controllo aggiuntivo ci si assicura che non si genera del codice per i file .ui non utilizzati.
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
39/
Integrazione nel codice con approccio diretto
La funzione principale crea la finestra di dialogo costruendo una classe QDialog standard che si usa per ospitare l'intercaccia utente descritta dal file form.ui.
int main(int argc, char *argv[]){
QApplication app(argc, argv);QDialog *window = new QDialog;Ui::Dialog ui;ui.setupUi(window);
window->show();return app.exec();
}
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
40/
Integrazione nel codice con approccio diretto
In questo caso, Ui::Dialog è un oggetto che descrive l'interfaccia relativa al file ui_form.h che imposta gli elementi grafici della finestra di dialogo e le connessioni tra i suoi signal e slot.
Questo approccio fornisce un metodo veloce e semplice per usare semplici, componenti auto-contenuti nella propria applicazione, ma molti componenti creati con il Qt designer avranno bisogno di essere integrati in modo più stretto con il resto del codice dell'applicazione.
Per ottenere ciò vediamo un brevissimo esempio.
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
41/
Esempio finaleEsempio finale
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
42/
Personalizzazione codice creato con designer
- form.pro:TEMPLATE = appHEADERS= newdialog.hFORMS = form.uiSOURCES= main.cpp newdialog.cpp
- main.cpp:#include "newdialog.h"#include <QApplication>
int main(int argc, char *argv[]){ QApplication app(argc, argv); NewDialog *window = new NewDialog;
window->show(); return app.exec();}
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
43/
Personalizzazione codice creato con designer: .h
- newdialog.h:#include "ui_form.h"
class NewDialog : public QDialog{ Q_OBJECT
public: NewDialog(QWidget *parent = 0);
private: Ui::Dialog ui;
public slots: void calculate();};
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
44/
Personalizzazione codice creato con designer: .cpp
- newdialog.cpp:
#include "newdialog.h"
NewDialog::NewDialog(QWidget *parent) : QDialog(parent){ ui.setupUi(this); ui.value->setFocus(); ui.result->clear(); connect(ui.evaluteButton, SIGNAL(clicked()), this, SLOT(calculate()));}
void NewDialog::calculate(){ ui.result->setText( ui.value->text() + " * 10 = " + QString::number(ui.value->text().toUInt() * 10) );}
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
45/
Personalizzazione codice creato con designer: form
Esce dall'applicazione
Cancella il valore base
calcola il valore base X 10
Sebastian Kügler <[email protected]>, FrOSCon
2006
Ing. Giovanni Venturi - http://www.kde-it.org/ - Roma - Linux Day 2007
Programmare con Qt4
46/
Curiosità?Curiosità?......
Domande?Domande?
Grazie a tutti per la vostra attenzioneGrazie a tutti per la vostra attenzioneKDE Italia - www.kde-it.orgKDE Italia - www.kde-it.org