2. Indice degli argomenti
• Introduzione al toolkit grafico Qt e a Qt Jambi
• HelloWorld.java
• Architettura Signal/Slot in Qt
• HelloWorldMore.java (signal/slot)
• Architettura Model/View in Qt
• HelloWorldMoreMore.java (QAbstractTableModel)
• Strumenti Qt: Designer, Linguist, Assistant (Creator...)
• JPA2: rapidissimo sguardo
• PyPaPi: progetto
• PyPaPi: architettura
• PyPaPi: esempio biblioteca
• Riferimenti e ringraziamenti
3. Introduzione al toolkit grafico Qt
• "Qt è una libreria multipiattaforma per lo sviluppo di
programmi coninterfaccia grafica tramite l'uso di widget"
(Wikipedia)
• 1991: inizio sviluppo (Haavard Nord e Eirik Chambe-Eng)
• Licenze: 1.45 FreeQt, 2.0 QPL, 2.2 GPL+QPL, 3 GPL
• gennaio 2009: LGPL (Nokia acquisisce Trolltech nel 2009)
• in C++, estesa in C; binding Java, Python, Perl, C, Php
• Windows (+CE/mobile), Symbian, Mac OSX, X11,
Maemo/MeeGo, Wayland, Linux embedded (+non ufficiali)
• Qt Creator (C++), Qt Designer, Qt Linguist, ...
• Qt-Jambi: velocità "nativa", look&feel, flessibilità
4. HelloWorld.java
import com.trolltech.qt.gui.*;
public class HelloWorld {
public static void main(String[] args) {
QApplication.initialize(args);
QMainWindow win = new QMainWindow();
QLabel label = new QLabel("Hello World!");
win.setCentralWidget(label);
win.show();
QApplication.execStatic();
}
}
6. HelloWorldMore.java
class MyWindow extends QMainWindow {
private QLabel label = new QLabel(" --- ");
private QPushButton bPress = new QPushButton("Press!");
private QPushButton bQuit = new QPushButton("Quit");
public MyWindow(){
this.setCentralWidget(new QWidget());
this.centralWidget().setLayout(new QHBoxLayout());
this.centralWidget().layout().addWidget(label);
this.centralWidget().layout().addWidget(bPress);
this.centralWidget().layout().addWidget(bQuit);
bQuit.clicked.connect(this, "close()");
bPress.clicked.connect(this, "press()");
}
private void press(){
this.label.setText("Hello World!");
}
}
7. Architettura Model/View in Qt
• Il model comunica con i dati, ed
espone un'interfaccia verso il resto
dell'architettura
• la view ottiene un index dal
modello, e lo utilizza per ottenere i
dati
• QAbstractItemModel
• QAbstractItemView
• QAbstractItemDelegate
8. QAbstractItemModel (QAbstractTableModel)
• implementazione di index(), parent(), rowCount(),
columnCount(), data() (read-only)
• QAbstractTableModel implementa già index() e parent()
• implementazione di setData() e reimplementazione di
flags() (return ItemEditable)
10. QAbstractItemDelegate
• E' usato per mostrare e editare dati da un modello.
• Personalizzazione attraverso la reimplementazione di
paint() e sizeHint().
• QItemDelegate ha già quello che serve, se non devo
personalizzare
11. HelloWorldMoreMore.java
class MyModel extends QAbstractTableModel {
@Override
public int columnCount(QModelIndex qmi) { return 2; }
@Override
public int rowCount(QModelIndex qmi) { return 3; }
@Override
public Object data(QModelIndex qmi, int i) {
if( i == ItemDataRole.CheckStateRole){
return null;
}
return "Riga "+qmi.row()+" colonna "+qmi.column();
}
}
14. PyPaPi: progetto
Separazione degli skill tra lo sviluppatore framework
e lo sviluppatore dell'applicazione
• creazione di modello dati e layout = 90%
• dichiara una sola volta, in un un solo punto
• "devo proprio chiederlo allo sviluppatore, o posso già
dedurlo implicitamente?"