Costruzione di Interfacce Lezione 16 Qt

Slides:



Advertisements
Presentazioni simili
Trieste, 26 novembre © 2005 – Renato Lukač Using OSS in Slovenian High Schools doc. dr. Renato Lukač LinuxDay Trieste.
Advertisements

I numeri, l’ora, I giorni della settimana
CUDA & OpenMP parallel programming.
Giovanni Falcone & Paolo Borsellino.
Cache Memory Prof. G. Nicosia University of Catania
Teoria e Tecniche del Riconoscimento
Esercitazioni If nidificati
Interfacce Java.
1 Teaching Cloud Computing and Windows Azure in Academia Domenico Talia UNIVERSITA DELLA CALABRIA & ICAR-CNR Italy Faculty Days 2010.
© and ® 2011 Vista Higher Learning, Inc.4B.1-1 Punto di partenza Italian uses two principal tenses to talk about events in the past: the passato prossimo.
Raffaele Cirullo Head of New Media Seconda Giornata italiana della statistica Aziende e bigdata.
J0 1 Marco Ronchetti - Corso di Formazione Sodalia – Febbraio 2001 – Modulo Web Programming Tomcat configuration.
prompt> java SumAverage
Biometry to enhance smart card security (MOC using TOC protocol)
Costruzione di Interfacce Lezione 11 Dal Java al C++ parte 2
11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 27 Xml for dummies Parte 2
Costruzione di Interfacce Lezione 6 Esercitazione Trasformazioni
Costruzione di Interfacce Lezione 5 Trasformazioni Affini
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 27 Estensioni Opengl, Multitexturing,
Costruzione di Interfacce Lezione 10 Dal Java al C++ parte 1
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 26 XML read e write / Gl Selection e picking
Costruzione di Interfacce Lezione 7 Shading
Costruzione di Interfacce Lezione 18 Qt Tutorial 2
Costruzione di Interfacce Lezione 19 Qt Tutorial Designer
Costruzione di Interfacce Lezione 5 Trasformazioni Affini
Costruzione di Interfacce Lezione 20 Qt + Opengl
Costruzione di Interfacce Lezione 12 C++STL
22 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 22 Texturing
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 24 Scene Graphs e Xml for dummies
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 Xml for dummies Parte 2
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 30 MMeditor e collision detection
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 21 Trackball
Costruzione di Interfacce Lezione 8 Rasterizzazione
TIPOLOGIA DELLE VARIABILI SPERIMENTALI: Variabili nominali Variabili quantali Variabili semi-quantitative Variabili quantitative.
Ergo : what is the source of EU-English? Standard British English? Standard American English? Both!!!! See morphology (use of British.
1. Conoscere luso delle collezioni in Java Comprendere le principali caratteristiche nelle varie classi di Collection disponibili Saper individuare quali.
JAVA C import java.util.*; #include <stdio.h>
1 Esercitazione sui segnali Problema: creare un programma analizzatore di file testuali che prenda come argomenti il nome di un file e una sequenza di.
2000 Prentice Hall, Inc. All rights reserved. 1 Capitolo 3 - Functions Outline 3.1Introduction 3.2Program Components in C++ 3.3Math Library Functions 3.4Functions.
2000 Prentice Hall, Inc. All rights reserved. 1 Capitolo 6: Classi e astrazione dati 1.Introduzione 2.Definizione delle strutture 3.Accedere ai membri.
Chistmas is the most loved holiday of the years. Adults and children look forward to Chistmas and its magical atmosphere. It is traditional to decorate.
Le regole Giocatori: da 2 a 10, anche a coppie o a squadre Scopo del gioco: scartare tutte le carte per primi Si gioca con 108 carte: 18 carte.
Players: 3 to 10, or teams. Aim of the game: find a name, starting with a specific letter, for each category. You need: internet connection laptop.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Alcuni, qualche, un po’ di
TELEFONO CELLULLARE E SACRA BIBBIA CELLULAR PHONE AND HOLY BIBLE.
Guardate le seguenti due frasi:
Motor Sizing.
24 aprile 2002 Avvisi: Risultati 1 o Esonero: (entro) lunedi 27 disponibili nella pag. WEB, ma anche esposti nella bacheca fuori dal corridoio 2 o dente,
Funzioni stringhe. chr Restituisce il carattere di un valore ascii dato. Per vedere lelenco dei codici ascii clicca QQQQ uuuu iiiiEsempio
Project Review Novembrer 17th, Project Review Agenda: Project goals User stories – use cases – scenarios Project plan summary Status as of November.
UG40 Energy Saving & Twin Cool units Functioning and Adjustment
Introduzione al linguaggio C. Cos’e’ il C? Il C e’ un linguaggio ad alto livello Un compilatore C prende in input un file contenente codice sorgente C.
Collection & Generics in Java
EMPOWERMENT OF VULNERABLE PEOPLE An integrated project.
PLURALI - with NOUNS PAY ATTENTION TO THE ENDING OF THE NOUN! “O” ---> “I” ex) il quaderno -> i quaderni “A” ---> “E” ex) la matita -> le matite “E” --->
The Beatles. Love, love, Love. Love, Love, Love. Love, Love, Love. There's nothing you can do that can't be done. Nothing you can sing that can't be sung.
Introduction to automatic ABMs documentation Keywords: Doxygen ODD protocol MASON documentation Simone Romano.
Teorie e tecniche della Comunicazione di massa Lezione 7 – 14 maggio 2014.
You’ve got a friend in me!
A PEACEFUL BRIDGE BETWEEN THE CULTURES TROUGH OLYMPICS OLYMPIC CREED: the most significant thing in the olympic games is not to win but to take part OLYMPIC.
Passato Prossimo. What is it?  Passato Prossimo is a past tense and it is equivalent to our:  “ed” as in she studied  Or “has” + “ed” as in she has.
Italian 1 -- Capitolo 2 -- Strutture
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 29 ancora MMeditor,
Ratifica dei trattati internazionali - Italia Art. 87 Costituzione “Il Presidente della Repubblica…ratifica i trattati internazionali, previa, quando occorra,
MSc in Communication Sciences Program in Technologies for Human Communication Davide Eynard Facoltà di scienze della comunicazione Università della.
Introduzione a Qt Marco Martin.
AusTel by taha.a.
Transcript della presentazione:

Costruzione di Interfacce Lezione 16 Qt

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni2 QT Cose e un toolkit per lo sviluppo multipiattaforma di applicazioni con una GUI complessa QT e composto da una class library e da alcuni tool per lo sviluppo rapido di applicazioni designer assistant qmake ecc.

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni3 QT risorse Lassistant ovviamente, I forum di QT Seguiremo i tutorial mostrati nellassistant. Allinizio senza lide del.net usando solo il compilatore.

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni4 tutorial 1 /**************************************************************** ** ** Qt tutorial 1 ** ****************************************************************/ #include int main( int argc, char **argv ) { QApplication a( argc, argv ); QPushButton hello( "Hello world!", 0 ); hello.resize( 100, 30 ); a.setMainWidget( &hello ); hello.show(); return a.exec(); }

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni5 QApplication manages the GUI application's control flow and main settings. It contains the main event loop It also handles the application's initialization and finalization For any GUI application that uses Qt, there is precisely one QApplication object, no matter whether the application has 0, 1, 2 or more windows at any time. parse the command line it knows about the application's windows. it must be created before any other objects related to the user interface are created

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni6 QPushButton e un widget (uno dei tanti) A widget is a user interface object that can process user input and draw graphics programmer can change many minor properties of a widget e.g. for a button text an image nel nostro caso e il widget principale dellapp. in pratica e il widget che quando viene chiuso lapp termina. non e obbligatorio avere un widget principale

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni7 Per compilare Da command line 1.qmake –project 2.qmake 3.nmake funzionano SOLO se avete settato tutto lenvironment bene. environment qt le dir dei binari di qt nel path set path=c:\qt\3.2.0Educationalbin;%PATH%; set QTDIR alla dir base di qt set QMAKESPEC = win32-msvc.net environment.net fate partire vcvars32.bat che si trova \Program Files\Microsoft Visual Studio.NET\Vc7\bin\

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni8 qmake qmake –project genera un file.pro che dice come fare un makefile… #################################################### # Automatically generated by qmake (1.06c) Mon Nov 3 #################################################### TEMPLATE = app CONFIG -= moc INCLUDEPATH +=. # Input SOURCES += hello.cpp Di default usa tutti i *.cpp, *.h, *.hpp, *.c, *ui, … che trova nella directory corrente

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni9 qmake qmake –makefile (o semplicemente qmake) genera un makefile a partire dal.pro che trova nella dir corrente e fatto per lambiente di compilazione specificato nella variabile dambiente qmakespec win32-msvc.net win32-borland … guardate nella dir QTDIR/mkspecs

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni10 make nmake (che e lequivalente ms del make classico) interpreta il makefile e genera leseguibile warning ufficialmente ignorabili: LINK : warning LNK4199: /DELAYLOAD:comdlg32.dll ignored; no imports found from comdlg32.dll LINK : warning LNK4199: /DELAYLOAD:oleaut32.dll ignored; no imports found from oleaut32.dll LINK : warning LNK4199: /DELAYLOAD:winmm.dll ignored; no imports found from winmm.dll LINK : warning LNK4199: /DELAYLOAD:wsock32.dll ignored; no imports found from wsock32.dll LINK : warning LNK4199: /DELAYLOAD:winspool.dll ignored; no imports found from winspool.dll cercate nel forum LINK warning LNK4199 DELAYLOAD

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni11 Esperimenti Provate a togliere il resize quale la grandezza che sceglie? setmainwidget cosa succede quando si chiude lapp?

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni12 Tutorial 2 /**************************************************************** ** ** Qt tutorial 2 ** ****************************************************************/ #include int main( int argc, char **argv ) { QApplication a( argc, argv ); QPushButton quit( "Quit", 0 ); quit.resize( 75, 30 ); quit.setFont( QFont( "Times", 18, QFont::Bold ) ); QObject::connect( &quit, SIGNAL(clicked()), &a, SLOT(quit()) ); a.setMainWidget( &quit ); quit.show(); return a.exec(); }

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni13 QFont Nulla di speciale, solo loggetto che per gestire font. istanziato al momento delluso per il bottone sfruttando il compilatore notate che ogni classe di qt ha il suo include…

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni14 Connect QObject::connect( &quit, SIGNAL(clicked()), &a, SLOT(quit()) ); Fa si che quando si prema il bottone lapplicazione termini E il meccanismo centrale di tutto QT

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni15 connect QObject::connect( &quit, SIGNAL(clicked()), &a, SLOT(quit()) ); it establishes a one-way connection between two Qt objects. Every Qt object can have both signals (to send messages) and slots (to receive messages). All widgets are Qt objects. They inherit QWidget which in turn inherits QObject. da un punto di vista c++ static bool QObject::connect ( const QObject * sender, const char * signal, const QObject * sender, const char * member ) nota: SIGNAL e SLOT sono macro che nascondono un meccanismo typesafe

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni16 Signal and slots You can connect as many signals as you want to a single slot, A signal can be connected to many slots It is possible to connect a signal directly to another signal. This will emit the second signal immediately whenever the first is emitted.

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni17 Signal and slots Signals are emitted by objects when they change their state in a way that may be interesting to the outside world. Slots can be used for receiving signals, but they are also normal member functions

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni18 Signal and slots The signals and slots mechanism is type safe the signature of a signal must match the signature of the receiving slot signals and slots can take any number of arguments of any type

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni19 Standard C++ vs QT style class Foo { public: Foo(); int value() const { return val; } void setValue( int ); private: int val; }; class Foo : public QObject { Q_OBJECT public: Foo(); int value() const { return val; } public slots: void setValue( int ); signals: void valueChanged( int ); private: int val; };

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni20 MOC Nota quello che si scrive non e piu C++, ma qualcosa di piu. Occorre un particolare preprocessor chiamato moc (Meta Object Compiler) che trasforma il tutto in C++ standard tutto cio e nascosto da qmake o dallintegrazione di qt con.net

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni21 Tutorial 3 /**************************************************************** ** ** Qt tutorial 3 ** ****************************************************************/ #include int main( int argc, char **argv ) { QApplication a( argc, argv ); QVBox box; box.resize( 200, 120 ); QPushButton quit( "Quit", &box ); quit.setFont( QFont( "Times", 18, QFont::Bold ) ); QObject::connect( &quit, SIGNAL(clicked()), &a, SLOT(quit()) ); a.setMainWidget( &box ); box.show(); return a.exec(); }`

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni22 Contenitori Si aggiunge un contenitore di widget QVBox box; All its child widgets will be placed vertically riferito nel costruttore del pushbutton QVBox box; box.resize( 200, 120 ); QPushButton quit( "Quit", &box ); e il contenitore il main widget e del contenitore che si fa show provate a cambiare contenitore (QHBox) e ad aggiungere altri pulsanti

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni23 Tutorial 4 #include class MyWidget : public QWidget { public: MyWidget( QWidget *parent=0, const char *name=0 ); }; MyWidget::MyWidget( QWidget *parent, const char *name ) : QWidget( parent, name ) { setMinimumSize( 200, 120 ); setMaximumSize( 200, 120 ); QPushButton *quit = new QPushButton( "Quit", this, "quit" ); quit->setGeometry( 62, 40, 75, 30 ); quit->setFont( QFont( "Times", 18, QFont::Bold ) ); connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) ); } int main( int argc, char **argv ) { QApplication a( argc, argv ); MyWidget w; w.setGeometry( 100, 100, 200, 120 ); a.setMainWidget( &w ); w.show(); return a.exec(); }

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni24 Subclassing Si nasconde il bottone ed il suo comportamento dentro una classe tutto fatto nel costruttore di MyWidget il bottone e una variabile temporanea qt delete all the qt objects figli di un altro widget. nel nostro caso il pushbutton quit viene deallocato quando sparisce myWidget qApp alias allapplicazione per evitare variabili globali dellutente.

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni25 Tutorial 6 (1) /**************************************************************** ** ** Qt tutorial 6 ** ****************************************************************/ #include class LCDRange : public QVBox { public: LCDRange( QWidget *parent=0, const char *name=0 ); }; LCDRange::LCDRange( QWidget *parent, const char *name ) : QVBox( parent, name ) { QLCDNumber *lcd = new QLCDNumber( 2, this, "lcd" ); QSlider * slider = new QSlider( Horizontal, this, "slider" ); slider->setRange( 0, 99 ); slider->setValue( 0 ); connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) ); }

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni26 Tutorial 6 (2) class MyWidget : public QVBox { public: MyWidget( QWidget *parent=0, const char *name=0 ); }; MyWidget::MyWidget( QWidget *parent, const char *name ) : QVBox( parent, name ) { QPushButton *quit = new QPushButton( "Quit", this, "quit" ); quit->setFont( QFont( "Times", 18, QFont::Bold ) ); connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) ); QGrid *grid = new QGrid( 4, this ); for( int r = 0 ; r < 4 ; r++ ) for( int c = 0 ; c < 4 ; c++ ) (void)new LCDRange( grid ); } int main( int argc, char **argv ) { QApplication a( argc, argv ); MyWidget w; a.setMainWidget( &w ); w.show(); return a.exec(); }

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni27 LCDRange Nuovo widget fatto da un numero e uno slider derivato da QVBox slider e numero connessi da connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) ); Non ha un api dallesterno non posso sapere nulla! Il resto del codice e un altro widget che fatto da tanti lcdrange.

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni28 Tutorial 7 Strutturiamo il codice lcdrange.h contains the LCDRange class definition. lcdrange.cpp contains the LCDRange implementation. main.cpp contains MyWidget and main. Facciamo diventare LCDrange una classe con signals e slot

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni29 lcdrange.h /**************************************************************** ** ** Definition of LCDRange class, Qt tutorial 7 ** ****************************************************************/ #ifndef LCDRANGE_H #define LCDRANGE_H #include class QSlider; class LCDRange : public QVBox { Q_OBJECT public: LCDRange( QWidget *parent=0, const char *name=0 ); int value() const; public slots: void setValue( int ); signals: void valueChanged( int ); private: QSlider *slider; }; #endif // LCDRANGE_H

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni30 lcdrange.h LCDrange ha uno stato e unapi la macro Q_OBJECT le keyword non c++ utilizzate prima di alcuni membri della classe tradotto in c++ dal MOC signals seguono le regole di accesso delle protected limplementazione non ce! il codice e qualcosa che riguarda qt non la nostra classe; la nostra classe deve solo dire QUANDO emette segnali slots sono normali funzioni membro della classe e la nostra classe a sapere cosa fare con il valore che gli arriva.

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni31 lcdrange.cpp /**************************************************************** ** ** Implementation of LCDRange class, Qt tutorial 7 ** ****************************************************************/ #include "lcdrange.h" #include LCDRange::LCDRange( QWidget *parent, const char *name ) : QVBox( parent, name ) { QLCDNumber *lcd = new QLCDNumber( 2, this, "lcd" ); slider = new QSlider( Horizontal, this, "slider" ); slider->setRange( 0, 99 ); slider->setValue( 0 ); connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) ); connect( slider, SIGNAL(valueChanged(int)), SIGNAL(valueChanged(int)) ); } int LCDRange::value() const { return slider->value(); } void LCDRange::setValue( int value ) { slider->setValue( value ); }

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni32 lcdrange.cpp nel costruttore due connect la prima per legare assieme slider e numero come nel tutorial precedente la seconda per dire quando la nostra classe emette un segnale quando si muove lo slider anche la nostra classe emette un segnale (connect tra due signal) setValue(int ) e il nostro slot, semplicemente setta il valore in arrivo nello slider (che poi fara una signal, che aggiorna il numero) Entrambe le connect partono dallo stesso segnale NESSUNA garanzia sullordine di esecuzione

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni33 main.cpp (1) #include #include "lcdrange.h" class MyWidget : public QVBox { public: MyWidget( QWidget *parent=0, const char *name=0 );}; MyWidget::MyWidget( QWidget *parent, const char *name ) : QVBox( parent, name ) { QPushButton *quit = new QPushButton( "Quit", this, "quit" ); quit->setFont( QFont( "Times", 18, QFont::Bold ) ); connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) ); QGrid *grid = new QGrid( 4, this ); LCDRange *previous = 0; for( int r = 0 ; r < 4 ; r++ ) { for( int c = 0 ; c < 4 ; c++ ) { LCDRange* lr = new LCDRange( grid ); if ( previous ) connect( lr, SIGNAL(valueChanged(int)), previous, SLOT(setValue(int)) ); previous = lr; }

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni34 main.cpp (2) #int main( int argc, char **argv ) { QApplication a( argc, argv ); MyWidget w; a.setMainWidget( &w ); w.show(); return a.exec(); }

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni35 main.cpp notare il concatenamento in cascata dei segnali if ( previous ) connect( lr, SIGNAL(valueChanged(int)), previous, SLOT(setValue(int)) ); muovendo uno slider cambiano tutti quelli precedenti…

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni36 Tutorial 8 La prima classe che si ridisegna, 5 file lcdrange.h, lcdrange.cpp cannon.h, cannon.cpp main.cpp lcdrange.h e lcdrange.cpp quasi uguali aggiunto setRange void LCDRange::setRange( int minVal, int maxVal ) { if ( minVal 99 || minVal > maxVal ) { qWarning( "LCDRange::setRange(%d,%d)\n" "\tRange must be 0..99\n" "\tand minVal must not be greater than maxVal", minVal, maxVal ); return; } slider->setRange( minVal, maxVal ); }

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni37 Tutorial 8 notare luso di qWarning stampa messaggi di errore e di warning su stderr (o al debugger) simili qDebug e qFatal loutput puo essere gestito in maniera diretta qInstallMsgHandler

29 Oct 2003Costruzione di Interfacce - Paolo Cignoni38 Riferimenti nellassistant tutorial #1 Signal and slots moc qmake il codice prendetelo direttamente dallassistant