PyPaPi Qt Java Framework

19
Qt toolkit e PyPaPi Framework Tiziano Lattisi

description

PyPaPi - Open Source Framework based on Java, JPA2 and Qt

Transcript of PyPaPi Qt Java Framework

Page 1: PyPaPi Qt Java Framework

Qt toolkit e PyPaPi Framework

Tiziano Lattisi

Page 2: PyPaPi Qt Java Framework

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

Page 3: PyPaPi Qt Java Framework

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à

Page 4: PyPaPi Qt Java Framework

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();    }}

Page 5: PyPaPi Qt Java Framework

Architettura Signal/Slot in Qt

Page 6: PyPaPi Qt Java Framework

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!");    }}

Page 7: PyPaPi Qt Java Framework

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

Page 8: PyPaPi Qt Java Framework

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) 

Page 9: PyPaPi Qt Java Framework

QAbstractItemView

QListView QTableView QTreeView

Page 10: PyPaPi Qt Java Framework

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

Page 11: PyPaPi Qt Java Framework

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();    }}

Page 12: PyPaPi Qt Java Framework

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

Page 13: PyPaPi Qt Java Framework

JPA2 rapidissimo sguardo

Fai click per aggiungere contenuto

Page 14: PyPaPi Qt Java Framework

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?"

Page 15: PyPaPi Qt Java Framework

PyPaPi: architettura

Page 16: PyPaPi Qt Java Framework

PyPaPi: esempio (base dati)

Page 17: PyPaPi Qt Java Framework

PyPaPi: esempio (form)

Page 18: PyPaPi Qt Java Framework

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;}

Page 19: PyPaPi Qt Java Framework

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