PyPaPi Qt Java Framework
-
Upload
tiziano-lattisi -
Category
Technology
-
view
693 -
download
0
description
Transcript of PyPaPi Qt Java Framework
Qt toolkit e PyPaPi Framework
Tiziano Lattisi
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
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à
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(); }}
Architettura Signal/Slot in Qt
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!"); }}
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
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)
QAbstractItemView
QListView QTableView QTreeView
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
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(); }}
Strumenti Qt
• Qt Creator (C++ IDE)• Qt Assistant (help system)• Qt Linguist (internationalization tools)• Qt Designer (forms builder)• Qt Quick Designer (apps e touch UI)• Integrazioni IDE: Eclipse, Visual Studio
JPA2 rapidissimo sguardo
Fai click per aggiungere contenuto
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?"
PyPaPi: architettura
PyPaPi: esempio (base dati)
PyPaPi: esempio (form)
PyPaPi: esempio codice (sì, tutto)
/* main code */Application.initialize(args);Database db = new Database();db.open("BiblioPU");
Form formBook = Register.registerForm(db.getEntityManagerFactory(), "classpath:biblio/forms/book.ui", Book.class);Form formPerson = Register.registerForm(db.getEntityManagerFactory(), "classpath:biblio/forms/person.ui", Person.class);Form formLoan = Register.registerForm(db.getEntityManagerFactory(), "classpath:biblio/forms/loan.ui", Loan.class);
Register.registerAdapters(Resolver.adaptersFromEntityClass(Book.class));
formPerson.show();Application.exec();
/* added method in Book entity */@Adapterpublic static Loan adaptToLoan(Book book){ Loan loan = new Loan(); loan.setBook(book); return loan;}
Riferimenti e ringraziamenti
• PyPaPi (http://www.pypapi.org)• Sorgenti PyPaPi (http://code.google.com/p/pypapi)• Qt Dev Network (http://qt-project.org/)• Qt-Jambi (http://qt-jambi.org)
GRAZIE
Tiziano [email protected]
http://www.linkedin.com/in/tizianolattisihttp://www.facebook.com/lattisi