IHM2. Eric Lecolinet - Télécom ParisTech 1. Toolkit graphique Qt Dessin interactif. Machines à états.
|
|
|
- Léonard Beauchamp
- il y a 10 ans
- Total affichages :
Transcription
1 IHM2 Toolkit graphique Qt Dessin interactif Machines à états Qt Designer Eric Lecolinet - Télécom ParisTech 1
2 Toolkit Qt Boîte à outils graphique multi-plateformes - Principaux OSs : Windows, Mac OS X, Linux/X11 - Plate-formes mobiles Support et Licences - Développement : TrollTech, puis Nokia, puis Digia - Licences LGPL (gratuite) et commerciales 3 Extensions, outils Extensions et outils - internationalisation: QString et Unicode - support sockets, XML, SQL, etc. - Open GL multiplateformes - Outils de développement: QtCreator, QtDesigner 4
3 Liens Liens utiles - Site Télécom : - Site Digia: - Documentation Qt 4.6 : Documentation Qt 4.7 : 5 Principaux widgets Arbre d'héritage 6
4 Hello Word! : première version #include <QApplication> #include <QLabel> int main(int argc, char **argv) { QApplication * app = new QApplication(argc, argv); QLabel * hello = new QLabel("Hello Qt!"); hello->show( ); return app->exec( ); Remarques - pointeurs C++ : attention aux -> et aux * et pas de ramasse miette! - parent passé en argument du constructeur - pas d argument (NULL) pour les "top-level" widgets - exec( ) lance la boucle de gestion des événements 7 2e version #include <QApplication> #include <QLabel> int main(int argc, char **argv) { QApplication app(argc, argv); QLabel hello("hello Qt!"); hello.resize(100, 30); hello.show( ); return app.exec( ); Remarques - la variable contient l objet =>. pour accéder aux champs et non -> - objets créés dans la pile => détruits en fin de fonction - avec Qt3 il faudrait rajouter: app.setmainwidget(&hello) 8
5 3e version avec conteneur #include <QApplication> // inclure headers adéquats! #include <QPushButton> #include <QWidget> #include <QFont> int main(int argc, char **argv) { QApplication app(argc, argv); QWidget box; // ne pas mettre de ( ) box.resize(200, 120); QPushButton quitbtn("quit", &box); // box sera le parent de quitbtn quitbtn.resize(100, 50); quitbtn.move(50, 35); quitbtn.setfont( QFont("Times", 18, QFont::Bold) ); QObject::connect( &quitbtn, SIGNAL(clicked( )), &app, SLOT(quit( )) ); Noter : - parent de quitbtn passé en argument - connect( ).. box.show( ); return app.exec( ); 9 Signaux et slots Un signal est émis vers le monde extérieur - par un objet quand il change d'état - on n indique pas à qui il s adresse Un slot est un récepteur - en pratique c'est une méthode Les signaux sont connectés à des slots - les slots sont alors appelés automatiquement 10
6 Signaux et slots Modularité, flexibilité - le même signal peut être connecté à plusieurs slots - plusieurs signaux peuvent être connectés à un même slot Noter que - l'émetteur n'a pas besoin de connaître le ou les récepteur(s) - il ne sait pas si le signal est reçu - le récepteur n'a pas non plus besoin de connaître l'émetteur => vers modèle multi-agents et programmation par composants 11 Connexion Typage fort - les types des paramètres des signaux et des slots doivent être les mêmes - un slot peut avoir moins de paramètres qu'un signal QObject::connect( &quitbtn, SIGNAL(clicked( )), &app, SLOT(quit( )) ); QObject::connect( &x, SIGNAL(balanceChanged(int)), &y, SLOT(setBalance(int)) ); QObject::connect( &x, SIGNAL(balanceChanged(int)), &app, SLOT(quit()) ); Remarques - aspect central de Qt - diffère de l'habituel mécanisme des callbacks ou listeners Avantages / inconvénients - SLOT et SIGNAL sont des macros = > phase de précompilation 12
7 Déclaration de slot Dans le fichier header (.h) class BankAccount : public QObject { Q_OBJECT private: int curbalance; public: - sous classe de QObject BankAccount( ) { curbalance = 0; int getbalance( ) const { return curbalance; public slots: void setbalance( int newbalance ); signals: void balancechanged( int newbalance ); ; - mot-clés Q_OBJECT, slots et signals pour précompilateur - signaux pas implémentés, slots doivent être implémentés 13 Définition de slot Dans le fichier source de l'implémentation (.cpp) void BankAccount::setBalance(int newbalance) { if (newbalance!= curbalance) { curbalance = newbalance; emit balancechanged(curbalance); - mot-clé emit pour précompilateur - provoque l'émission du signal balancechanged avec la nouvelle valeur de curbalance 14
8 Définition de slot Dans le fichier source de l'implémentation (.cpp) void BankAccount::setBalance(int newbalance) { if (newbalance!= curbalance) { curbalance = newbalance; emit balancechanged(curbalance); vérifier que la valeur a effectivement changé pour éviter les boucles infinies! - mot-clé emit pour précompilateur - provoque l'émission du signal balancechanged avec la nouvelle valeur de curbalance 15 Connexion Connexion simple BankAccount x, y; connect( &x, SIGNAL(balanceChanged(int)), &y, SLOT(setBalance(int)) ); x.setbalance( 2450 ); - x est mis à le signal balancechanged() est émis - il est reçu par le slot setbalance() de y - y est mis à
9 Connexion Connexion dans les deux sens BankAccount x, y; connect( &x, SIGNAL(balanceChanged(int)), &y, SLOT(setBalance(int)) ); connect( &y, SIGNAL(balanceChanged(int)), &x, SLOT(setBalance(int)) ); x.setbalance( 2450 ); - OK? 17 Connexion Connexion dans les deux sens BankAccount x, y; connect( &x, SIGNAL(balanceChanged(int)), &y, SLOT(setBalance(int)) ); connect( &y, SIGNAL(balanceChanged(int)), &x, SLOT(setBalance(int)) ); x.setbalance( 2450 ); - OK : car test dans setbalance() - sinon boucle infinie! void BankAccount::setBalance(int newbalance) { if (newbalance!= curbalance) { curbalance = newbalance; emit balancechanged(curbalance); 18
10 Connexion Propagation de signal connect( &x, SIGNAL(balanceChanged(int)), &controller, SIGNAL(changed(int)) ); class Controller : public QObject { Q_OBJECT signals: void changed(int);... ; 19 Compilation Meta Object Compiler (MOC) - pré-processeur C++ - génère du code supplémentaire (tables de signaux / slots) - permet aussi de récupérer le nom de la classe et de faire des test d héritage - attention: ne pas oublier le mot-clé Q_OBJECT Utilisation de qmake - dans le répertoire contenant les fichiers sources faire: qmake -project qmake make // crée le fichier xxx.pro (décrit le projet) // crée le fichier Makefile (ou équivalent si IDE) // crée les fichiers moc (un par fichier ayant des slots), // et les fichiers binaires (*.o et exécutable) 20
11 Fenêtre principale (QMainWindow) Zones prédéfinies pour: - barre de menu - barre d outils - barre de statut - zone centrale - (et d autres fonctionnalités ) Utilisation: - créer une sous-classe de QMainWindow - dont le constructeur crée / ajoute des objets graphiques à cette fenêtre 21 Fenêtre principale Dans le constructeur d'une classe dérivant de QMainWindow // menubar() est une method de QMainWindow QMenuBar * menubar = this->menubar( ); QMenu * filemenu = menubar->addmenu( tr ("&File") ); // new.png est un fichier qui sera spécifié dans un fichier de ressources.qrc QAction * newaction = new QAction( QIcon(":new.png"), tr("&new..."), this); newaction->setshortcut( tr("ctrl+n")); // accélérateur clavier newaction->settooltip( tr("new file")); // bulle d aide newaction->setstatustip( tr("new file")); // barre de statut filemenu->addaction(newaction); // rajouter l action au menu déroulant // connecter le signal à un slot de this connect(newaction, SIGNAL(triggered( )), this, SLOT(open( ))); 22
12 Fenêtre principale Actions - les actions peuvent s ajouter à la fois dans les menus et les toolbars QToolBar * toolbar = this->addtoolbar( tr("file") ); toolbar->addaction(newaction); Widget central tr( ) QTextEdit * text = new QTextEdit(this); setcentralwidget(text); - permet de traduire le texte (localisation) - (à suivre) 23 Boîtes de dialogue QFileDialog, QMessageBox 24
13 Boîte de dialogue modale Solution générale QFileDialog dialog (parent); dialog.setfilter("text files (*.txt)"); QStringList filenames; if (dialog.exec() == QDialog::Accepted) { filenames = dialog.selectedfiles(); QString firstname = filenames[0];... Solution simplifiée Note : dialog.exec() lance une boucle de gestion des événements secondaire! QString filename = QFileDialog::getOpenFileName( this, tr("open Image"), "/home/jana", tr("image Files (*.png *.jpg *.bmp)") ); // titre // répertoire initial // filtre 25 QString Codage Unicode 16 bits - Suite de QChars 1 caractère = 1 QChar de 16 bits (cas usuel) 1 caractère = 2 QChars de 16 bits (pour valeurs > 65535) - Conversions d une QString : toascii( ) : ASCII 8 bits tolatin1( ) : Latin-1 (ISO ) 8 bits toutf8( ) : UTF-8 Unicode multibyte (1 caractère = 1 à 4 octets) tolocal8bit( ) : codage local 8 bits - qprintable ( const QString & str ) équivalent à : str.tolocal8bit( ).constdata( ) 26
14 QFile QFile - lecture, écriture de fichiers - exemples : QFile file( filename ); if ( file.open( QIODevice::ReadOnly QIODevice::Text) )...; if ( file.open( QIODevice::WriteOnly ) )...; 27 QTextStream QTextStream - lecture ou écriture de texte depuis un QFile : QTextStream stream( &file ); - Améliorent les iostream du C++ compatibles avec QString et Unicode (et d'autres codecs de caractères) 28
15 QTextStream QTextStream - lecture ou écriture de texte depuis un QFile : QTextStream stream( &file ); - opérateurs << et >> : outstream << string; instream >> string; // attention : s arrête au premier espace! - méthodes utiles : QString readline( taillemax = 0 ); // pas de limite de taille si = 0 QString readall( ); // pratique mais à n utiliser que pour des petits fichiers - codecs : setcodec( codec ), setautodetectunicode( bool ); 29 Layout Buts - internationalisation - retaillage interactif - éviter d avoir à faire des calculs 30
16 Layout QHBoxLayout, QVBoxLayout, QGridLayout QFormLayout (cf. aussi QMainWindow) 31 Layout : exemple QVBoxLayout * v_layout = new QVBoxLayout( ); v_layout->addwidget( new QPushButton( "OK" ) ); v_layout->addwidget( new QPushButton( "Cancel" ) ); v_layout->addstretch( ); v_layout->addwidget( new QPushButton( "Help" ) ); Les Layouts - peuvent être emboîtés - ne sont pas liés à une hiérarchie de conteneurs comme en Java - cf. le «stretch» 32
17 Layout : exemple QVBoxLayout * v_layout = new QVBoxLayout( ); v_layout->addwidget( new QPushButton( "OK" ) ); v_layout->addwidget( new QPushButton( "Cancel" ) ); v_layout->addstretch( ); v_layout->addwidget( new QPushButton( "Help" ) ); QListBox * country_list = new QListBox( this ); countrylist->insertitem( "Canada" );...etc... QHBoxLayout * h_layout = new QHBoxLayout( ); h_layout->addwidget( country_list ); h_layout->addlayout( v_layout ); 33 Layout : exemple QVBoxLayout * v_layout = new QVBoxLayout( ); v_layout->addwidget( new QPushButton( "OK" ) ); v_layout->addwidget( new QPushButton( "Cancel" ) ); v_layout->addstretch( ); v_layout->addwidget( new QPushButton( "Help" ) ); QListBox * country_list = new QListBox( this ); countrylist->insertitem( "Canada" );...etc... QHBoxLayout * h_layout = new QHBoxLayout( ); h_layout->addwidget( country_list ); h_layout->addlayout( v_layout ); QVBoxLayout * top_layout = new QVBoxLayout( ); top_layout->addwidget( new QLabel( "Select a country", this ) ); top_layout->addlayout( h_layout ); window->setlayout( top_layout ); window->show( ); 34
18 Styles Emulation du "Look and Feel" - Look and feel simulé et paramétrable (comme Swing) - rapidité, flexibilité, extensibilité, - pas restreint à un "dénominateur commun" QStyle - QApplication::setStyle( new MyCustomStyle ); 35 Ressources Fichier source QAction * newaction = new QAction( QIcon(":new.png"), tr("&new..."), this ); newaction->setshortcut( tr("ctrl+n") ); // : signifie: relatif au programme // tr( ) pour éventuelle traduction // l accélérateur clavier peut être traduit 36
19 Ressources Fichier.qrc - créé à la main ou par QtCreator <!DOCTYPE RCC><RCC version="1.0"> <qresource> <file>images/copy.png</file> <file>images/cut.png</file> <file>images/new.png</file> <file>images/open.png</file> <file>images/paste.png</file> <file>images/save.png</file> </qresource> </RCC> 37 Retour sur les signaux et les slots Comment différencier des actions dans un même slot? Action 1 Slot doit() Action 2 38
20 Solution 1: QObject::sender() // Dans le.h en variables d instance de MaClasse : QAction * action1, * action2, ; Action 1 // Dans le.cpp: void MaClasse::createGUI( ) { action1 = new QAction(tr("Action 1"), this); connect(action1, SIGNAL(triggered()), this, SLOT(doIt())); Slot doit() action2 = new QAction(tr("Action 2"), this); connect(action2, SIGNAL(triggered()), this, SLOT(doIt())); Action 2 void MaClasse::doIt( ) { QObject * sender = QObject::sender( ); if (sender == action1)...; else if (sender == action2)... ;. // un peu comme getsource() de Java / Swing 39 Solution 2: QActionGroup // Dans le.h en variables d instance de MaClasse : QAction * action1, * action2, ; Action 1 // Dans le.cpp: void MaClasse::createGUI( ) { QActionGroup *group = new QActionGroup(this); Slot doit() // un seul connect! connect(group, SIGNAL(triggered(QAction *)), this, SLOT(doIt(QAction *))); action1 = group->addaction(tr("action 1")); action2 = group->addaction(tr("action 2")); Action 2 ActionGroup void MaClasse::doIt(QAction * sender ) { if (sender == action1)...; else if (sender == action2)... ;. // l action est récupérée via le paramètre 40
21 Solution 2: QActionGroup Par défaut le groupe est exclusif, sinon faire : group->setexclusive(false); On peut faire de même pour les boutons (QPushButton, QRadioButton, QCheckBox ) : QButtonGroup * group = new QButtonGroup(this); En utilisant le signal : ou : buttonclicked(qabstractbutton * button) buttonclicked(int id) 41 Solution 3: QSignalMapper void MaClasse::createGUI( ) { QSignalMapper* mapper = new QSignalMapper (this) ; connect(mapper, SIGNAL(mapped(int)), this, SLOT(doIt(int))) ; QPushButton * btn1 = new QPushButton("Action 1"), this); connect (btn1, SIGNAL(triggered( )), mapper, SLOT(map( ))) ; mapper -> setmapping (btn1, 1) ; QPushButton * btn2 = new QPushButton("Action 1"), this); connect (btn2, SIGNAL(triggered( )), mapper, SLOT(map( ))) ; mapper -> setmapping (btn2, 2) ; void MaClasse::doIt(int value) {. // l action est récupérée via le paramètre Possible pour les types : int, QString&, QWidget* et QObject* 42
22 Graphique 2D Deux modèles - QPainter : modèle fonctionnel - Graphics View : graphe de scène 43 Graphique 2D QPainter - modèle graphique évolué (rotations, indépendance / pilote...) - similaire à Graphics2D de Java - modèle fonctionnel : ensemble d'objets et méthodes permettant de dessiner gestion "à la main" du réaffichage, du picking, etc. - exemple : QPainter painter( this ); // this est un widget painter.setpen( QPen(red, 2, DashLine) ); painter.drawrect( 25, 15, 120, 60 ); - section dédiée dans la suite du cours 44
23 Graphique 2D Graphics View - graphique structuré représentation objet du dessin réaffichage, picking automatiques - vues d un graphe de scène : QGraphicsScene QGraphicsView QGraphicsItem, etc. QGraphicsScene scene; QGraphicsRectItem * rect = scene.addrect( QRectF(0,0,100,100) ); QGraphicsItem *item = scene.itemat(50, 50);... QGraphicsView view( &scene ); view.show( ); 45 Graphique 3D Dessin 3D - grâce à OpenGL - principe : créer une sous-classe de QGLWidget et redéfinir : virtual void initializegl( ) virtual void resizegl(int w, int h) virtual void paintgl( ) - pour demander un réaffichage il faut appeler : updategl( ) (effectué après terminaison d'une fonction de callback ) - Note: QtGraphicsView est également compatible avec OpenGL 46
24 OpenGL : Box3D.h #include <QGLWidget> class Box3D : public QGLWidget { Q_OBJECT GLuint object; GLfloat rotx, roty, rotz; public: Box3D( QWidget *parent = 0); ~Box3D(); protected: void initializegl(); void paintgl(); void resizegl( int w, int h ); GLuint makeobject(); public slots: void setrotationx(int deg) { rotx = deg; updategl( ); void setrotationy(int deg) { roty = deg; updategl( ); void setrotationz(int deg) { rotz = deg; updategl( ); ; 47 OpenGL : Box3D.cpp #include "Box3D.h" Box3D::Box3D( QWidget *parent ) : QGLWidget( parent ) { object = 0; rotx = roty = rotz = 0.0; Box3D::~Box3D() { makecurrent(); gldeletelists(object, 1); 48
25 OpenGL : Box3D.cpp void Box3D::initializeGL() { qglclearcolor( darkblue ); object = makeobject(); glshademodel(gl_flat); void Box3D::paintGL() { glclear(gl_color_buffer_bit); glloadidentity(); gltranslatef(0.0, 0.0, -10.0); glrotatef(rotx, 1.0, 0.0, 0.0); glrotatef(roty, 0.0, 1.0, 0.0); glrotatef(rotz, 0.0, 0.0, 1.0); glcalllist(object); void Box3D::resizeGL( int w, int h ) { glviewport(0, 0, w, h); glmatrixmode(gl_projection); glloadidentity(); glfrustum(-1.0,1.0,-1.0,1.0,5.0,15.0); glmatrixmode( GL_MODELVIEW ); GLuint Box3D::makeObject() { GLuint list = glgenlists( 1 ); glnewlist( list, GL_COMPILE ); qglcolor( yellow ); gllinewidth( 2.0 ); glbegin( GL_LINE_LOOP ); glvertex3f( +1.5, +1.0, +0.8 ); glvertex3f( +1.5, +1.0, -0.8 ); /*... */ glend(); glendlist(); return list; 49 OpenGL : main #include <qapplication.h> #include <qslider.h> #include <qvbox.h> #include "box3d.h" void createslider( QWidget * parent, Box3D * box3d, const char * slot ) // cf. le type de slot! { QSlider *slider = new QSlider(QSlider::Horizontal, parent); slider->settickposition(qslider:: TicksBelow); QObject::connect( slider, SIGNAL(valueChanged(int)), box3d, slot); 50
26 OpenGL : main int main(int argc, char **argv) { QApplication::setColorSpec(QApplication::CustomColor); QApplication app(argc, argv); if (!QGLFormat::hasOpenGL( )) qfatal("this system has no OpenGL support"); QWidget * topw = new QWidget( ); topw->setcaption("opengl Box"); topw->setmargin(11); topw->setspacing(6); Box3D * box3d = new Box3D(parent); createslider( topw, box3d, SLOT(setRotationX(int)) ); createslider( topw, box3d, SLOT(setRotationY(int)) ); createslider( topw, box3d, SLOT(setRotationZ(int)) ); parent->resize( 250, 250 ); parent->show( ); return app.exec( ); 51 Dessin interactif Illustré avec Qt 52
27 Dessiner dans un widget Un widget est repeint lorsque - l application est lancée ou déiconifiée - l application est déplacée (selon l OS) - une fenêtre qui en cachait une partie est déplacée - on le demande explicitement via update( ) Dans tous les cas - la méthode void paintevent (QPaintEvent *) de QWidget est appelée 53 Dessiner dans un widget Un widget est repeint lorsque - l application est lancée ou déiconifiée - l application est déplacée (selon l OS) - une fenêtre qui en cachait une partie est déplacée - on le demande explicitement via update( ) Dans tous les cas - la méthode void paintevent (QPaintEvent *) de QWidget est appelée Attention - afficher le dessin dans cette méthode et aucune autre - ne pas appeler paintevent() directement 54
28 Modèle "damaged / repaint" void mycallback(...) Evénements Boucle de gestion des événements... update();... update(x, y, w, h);... update(region1); update(region2);... void paintevent(qpaintevent* e) {... - update() signifie qu'une zone est endommagée - paintevent() effectue le réaffichage 55 Modèle "damaged / repaint" void mycallback(...) Evénements Boucle de gestion des événements... update();... update(x, y, w, h);... update(region1); update(region2);... void paintevent(qpaintevent* e) {... - update() signifie qu'une zone est endommagée - paintevent() effectue le réaffichage zone = tout le widget sauf si on précise met les demandes dans une file d'attente n'est appelée qu'une seule fois, au retour dans la boucle de gestion des événements, après compactage 56
29 Modèle "damaged / repaint" Remarques - repaint() entraîne un réaffichage immédiat (contrairement à update()) - ne pas l'utiliser sauf cas particuliers (animation) - Java fonctionne de manière similaire mais les noms sont différents! - update() Qt == repaint() Java - paintevent() Qt == paint() Java 57 Redessiner Créer une sous-classe de QWidget qui redéfinit paintevent() #include <QWidget> class Canvas : public QWidget { public: Canvas(QWidget* parent) : QWidget(parent) { protected: virtual void paintevent(qpaintevent*); ; Header Canvas.h #include <QPainter> Implémentation Canvas.cpp #include "Canvas.h" void Canvas::paintEvent(QPaintEvent* e) { QWidget::paintEvent(e); QPainter painter(this); painter.drawline(50, 10, 100, 20); // comportement standard (afficher le fond, etc.) // crée un Painter pour ce Canvas NOTE : n utiliser QPainter que dans paintevent() (à cause du double buffering) 58
30 Détecter les événements Méthodes de QWidget appelées quand : - on relâche un bouton - on double-clique - on déplace la souris Remarque - en appuyant (ou pas) sur bouton souris selon mousetracking() - pas de signals / slots! void mousepressevent(qmouseevent*); void mousereleaseevent(qmouseevent*); void mousedoubleclickevent(qmouseevent*); void mousemoveevent(qmouseevent*); void setmousetracking(bool) bool hasmousetracking() 59 Détecter les événements #include <QWidget> #include <QMouseEvent> Canvas.h #include "Canvas.h" Canvas.cpp class Canvas : public QWidget { public: Canvas(QWidget* p) : QWidget(p) { protected: void mousepressevent(qmouseevent*); ; void Canvas:: mousepressevent(qmouseevent* e) { if (e->button() == Qt::LeftButton) {... update(); // demande de réaffichage QMouseEvent permet de récupérer : - button( ) : le bouton souris qui a déclenché l événement. ex: Qt::LeftButton - buttons( ) : l état des autres boutons. ex: Qt::LeftButton Qt::MidButton - pos( ) la position locale de la souris (= relative au widget) - globalpos( ) la position globale 60
31 Attributs de QMouseEvent void Canvas:: mousepressevent(qmouseevent* e) { if (e->button() == Qt::LeftButton) {... update(); QMouseEvent permet de récupérer - button( ) : bouton souris qui a déclenché l événement. ex: Qt::LeftButton - buttons( ) : état des autres boutons. ex: Qt::LeftButton Qt::MidButton - modifiers( ) : modificateurs clavier. ex: Qt::ControlModifier Qt:: ShiftModifier - la position 61 Récupérer la position du curseur void Canvas:: mousepressevent(qmouseevent* e) { if (e->button() == Qt::LeftButton) {... update(); QMouseEvent permet de récupérer la position (variantes selon versions de Qt) - position locale (relative au widget) : pos( ) (ou posf( )) - position globale (ou relative à ce référentiel) : globalpos( ), windowpos( ), screenpos( ) utile si on déplace le widget interactivement! 62
32 Récupérer la position du curseur void Canvas:: mousepressevent(qmouseevent* e) { if (e->button() == Qt::LeftButton) {... update(); QMouseEvent permet de récupérer la position (variantes selon versions de Qt) - position locale (relative au widget) : pos( ) (ou posf( )) - position globale (ou relative à ce référentiel) : globalpos( ), windowpos( ), screenpos( ) Alternative - QCursor::pos( ) : position du curseur sur l'écran - QWidget::mapToGlobal( ), mapfromglobal( )... : conversion de coordonnées 63 Ignorer les événements Ignorer les événements - QEvent::ignore( ) : signifie que le receveur ne veut pas l'événement ex : dans méthode closeevent() de la MainWindow pour ne pas quitter l'appli 64
33 Synthèse mousepressevent(qmouseevent* e) événements update(); paintevent(qpaintevent* e) { boucle de gestion des événements QWidget::paintEvent(e); QPainter.painter(this);... mousemoveevent(qmouseevent* e) update(); mousemoveevent(qmouseevent* e) update(); mousereleaseevent(qmouseevent* e) update(); 65 QPainter Attributs - setpen( ) : lignes et contours - setbrush( ) : remplissage - setfont( ) : texte - settransform( ), etc. : transformations affines - setcliprect/path/region( ) : clipping (découpage) - setcompositionmode( ) : composition 66
34 QPainter Lignes et contours - drawpoint(), drawpoints() - drawline(), drawlines() - drawrect(), drawrects() - drawarc(), drawellipse() - drawpolygon(), drawpolyline(), etc... - drawpath() : chemin complexe Remplissage - fillrect(), fillpath() Divers - drawtext() - drawpixmap(), drawimage(), drawpicture() - etc. 67 QPainter Classes utiles - entiers: QPoint, QLine, QRect, QPolygon - flottants: QPointF, QLineF,... - chemin complexe: QPainterPath - zone d affichage: QRegion 68
35 Pinceau: QPen Attributs - style : type de ligne - width : épaisseur (0 = «cosmetique») - brush : attributs du pinceau (couleur...) - capstyle : terminaisons - joinstyle : jointures Qt::PenStyle Cap Style Join Style 69 Pinceau: QPen Exemple // dans méthode PaintEvent() QPen pen; // default pen pen.setstyle(qt::dashdotline); pen.setwidth(3); pen.setbrush(qt::green); pen.setcapstyle(qt::roundcap); pen.setjoinstyle(qt::roundjoin); QPainter painter(this); painter.setpen(pen); Qt::PenStyle Cap Style Join Style 70
36 Remplissage: QBrush Attributs - style - color - gradient - texture Qt::BrushStyle QBrush brush(... );... QPainter painter(this); painter.setbrush(brush); 71 Remplissage: QBrush Attributs - style - color - gradient - texture QColor - modèles RGB, HSV or CMYK - composante alpha (transparence) : alpha blending - couleurs prédéfinies: Qt::GlobalColor Qt::GlobalColor 72
37 Remplissage: gradients Type de gradients - lineaire, - radial - conique QLinearGradient gradient( QPointF(0, 0), QPointF(100, 100) ); gradient.setcolorat(0, Qt::white); gradient.setcolorat(1, Qt::blue); QBrush brush(gradient); QLinearGradient QRadialGradient Type de coordonnées - défini par QGradient::CoordinateMode QConicalGradient répétition: setspread() 73 Composition Modes de composition - opérateurs de Porter Duff: - définissent : F(source, destination) - défaut : SourceOver avec alpha blending dst <= asrc * src + (1-asrc) * adst * dst - limitations selon implémentation et Paint Device Méthode: QPainter::setCompositionMode( ) 74
38 Découpage (clipping) Découpage - selon un rectangle, une région ou un path - QPainter::setClipping(), setcliprect(), setclipregion(), setclippath() QRegion - united(), intersected(), subtracted(), xored() QRegion r1(qrect(100, 100, 200, 80), QRegion::Ellipse); QRegion r2(qrect(100, 120, 90, 30)); QRegion r3 = r1.intersected(r2); // r1: elliptic region // r2: rectangular region // r3: intersection QPainter painter(this); painter.setclipregion(r3);...etc... // paint clipped graphics 75 Transformations affines Transformations - translate() - rotate() - scale() - shear() - settransform() Démo! QPainter painter( this ); painter.setrenderhint( QPainter::Antialiasing ); painter.translate( width( )/2, height( )/2 ); painter.scale( side/200.0, side/200.0 ); painter.save( ); // empile l état courant painter.rotate( 30.0 * ((time.hour() + time.minute() / 60.0)) ); painter.drawconvexpolygon( hourhand, 3 ); painter.restore( ); // dépile 76
39 Antialiasing Anti-aliasing - éviter l effet d escalier - particulièrement utile pour les polices de caractères Subpixel rendering - exemples : ClearType, texte sous MacOSX ClearType MacOSX (Wikipedia) 77 Antialiasing Anti-aliasing sous Qt QPainter painter(this); painter.setrenderhint(qpainter::antialiasing); painter.setpen(qt::darkgreen); painter.drawline(2, 7, 6, 1); Rendering hints - hint = option de rendu effet non garanti dépend de l implémentation et du matériel - QPainter::setRenderingHints( ) 78
40 Antialiasing et cordonnées Epaisseurs impaire - pixels dessinés à droite et en dessous Note QRect::right() = left() + width() -1 Dessin anti-aliasé - pixels répartis autour de la ligne idéale 79 Paths QPainterPath - figure composée d une suite arbitraire de lignes et courbes affichée par: QPainter::drawPath() peut aussi servir pour remplissage, profilage, découpage Méthodes - déplacements: moveto(), arcmoveto() - dessin: lineto(), arcto() - courbes de Bezier: quadto(), cubicto() - addrect(), addellipse(), addpolygon(), addpath()... - addtext() - translate(), union, addition, soustraction... - et d autres encore... Démo! 80
41 Paths QPointF center, startpoint; QPainterPath mypath; mypath.moveto( center ); mypath.arcto( boundingrect, startangle, sweepangle ); QPainter painter( this ); painter.setbrush( mygradient ); painter.setpen( mypen ); painter.drawpath( mypath ); 81 Paths QPointF baseline(x, y); QPainterPath mypath; mypath.addtext( baseline, myfont, "Qt" ); QPainter painter( this );... etc... painter.drawpath( mypath ); 82
42 Paths QPainterPath path; path.addrect(20, 20, 60, 60); path.moveto(0, 0); path.cubicto(99, 0, 50, 50, 99, 99); path.cubicto(0, 99, 50, 50, 0, 0); QPainter painter(this); painter.fillrect(0, 0, 100, 100, Qt::white); painter.setpen(qpen(qcolor(79, 106, 25), 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin)); painter.setbrush(qcolor(122, 163, 39)); painter.drawpath(path); Qt::OddEvenFill (défaut) Qt::WindingFill 83 Images Types d images - QImage: optimisé pour E/S et accès/manipulation des pixels QPixmap, QBitmap : optimisés pour affichage l écran - QPicture: pour enregistrer et rejouer les commandes d un QPainter - dans tous les cas : on peut dessiner dedans avec un QPainter Entrées/sorties - load() / save() : depuis/vers un fichier, principaux formats supportés - loadfromdata() : depuis la mémoire 84
43 Images Format RGB QImage image(3, 3, QImage::Format_RGB32); QRgb value; value = qrgb(122, 163, 39); // 0xff7aa327 image.setpixel(0, 1, value); image.setpixel(1, 0, value) 85 Images Format indexé QImage image(3, 3, QImage::Format_Indexed8); QRgb value; value = qrgb(122, 163, 39); // 0xff7aa327 image.setcolor(0, value); value = qrgb(237, 187, 51); // 0xffedba31 image.setcolor(1, value); image.setpixel(0, 1, 0); image.setpixel(1, 0, 1); 86
44 QPicture Enregistrer et rejouer les commandes d un QPainter - Enregistrer : QPicture picture; QPainter painter; painter.begin( &picture ); painter.drawellipse( 10,20, 80,70 ); painter.end( ); picture.save( "drawing.pic" ); // paint in picture // draw an ellipse // painting done // save picture - Rejouer : QPicture picture; picture.load( "drawing.pic" ); // load picture QPainter painter; painter.begin( &myimage ); // paint in myimage painter.drawpicture( 0, 0, picture ); // draw the picture at (0,0) painter.end( ); // painting done 87 Picking Picking avec QRect, QRectF - intersects() - contains() Picking avec QPainterPath - intersects(const QRectF & rectangle) - intersects(const QPainterPath & path) - contains(const QPointF & point) - contains(const QRectF & rectangle) - contains(const QPainterPath & path) Retourne l intersection - QPainterPath intersected(const QPainterPath & path) 88
45 Picking / Interaction Exemple - teste si la souris est dans le rectangle quand on appuie sur le bouton de la souris - met à jour la position du rectangle pour qu il soit centré QRect rect; // variable d instance de mon Widget de dessin void mousepressevent(qmouseevent* e) { if (rect.contains( e->pos() )) { rect.movecenter( e->pos() ); update( );... void paintevent(qpaintevent* e ) { QPainter painter( this );... // specifier attributs graphiques painter.drawrect( rect ); 89 Surfaces d affichage QPainter : outil de dessin QPaintDevice : objet sur lequel on peut dessiner QPaintEngine : moteur de rendu On peut dessiner dans tout ce qui hérite de QPaintDevice, en particulier QWidget mais aussi: QPrinter, QPixmap, QImage, QPicture, QGLPixelBuffer, etc. 90
46 Surfaces d affichage SVG - QSvgWidget QSvgRenderer OpenGL - QGLWidget QGLPixelBuffer QGLFramebufferObject Impression - QPrinter QSvgWidget 91 Performance de l affichage Problèmes classiques : - Flicking et tearing (scintillement et déchirement) - Lag (latence) 92
47 Flicking Flicking - scintillement de l affichage car l oeil perçoit les images intermédiaires - exemple : pour rafraichir cette page il faut : 1) tout «effacer» (repeindre le fond) 2) tout redessiner => scintillement si le fond du transparent est sombre alors que le fond de la fenêtre est blanc source: AnandTech 93 Double buffering Double buffering - solution au flicking : dessin dans le back buffer recopie dans le front buffer (le buffer vidéo qui contrôle ce qui est affiché sur l écran) - par défaut avec Qt4 source: AnandTech 94
48 Tearing Possible problème : Tearing - l image apparait en 2 (ou 3...) parties horizontales - problème : recopie du back buffer avant que le dessin soit complet mélange de plusieurs "frames" vidéo en particulier avec jeux vidéo et autres applications graphiquement demandantes source: AnandTech 95 Tearing Solution au Tearing - VSync (Vertical synchronization ) - rendu synchronisé avec l'affichage - inconvénient : ralentit l'affichage source: AnandTech 96
49 Page flipping Page flipping - alternative au double buffering - pas de recopie des pixels, on change juste de buffer - plus rapide (mais tout de même contraint par VSync) src: Oracle/JavaSE 97 Triple buffering Triple buffering - évite le ralentissement dû à la VSync - un des 2 back buffers est toujours complet - le front buffer peut être mis à jour sans attendre source: AnandTech 98
50 Performance de l affichage Latence (lag) - effet : l affichage «ne suit pas» l interaction - raison : le rendu n'est pas assez rapide 99 Performance de l affichage Latence (lag) - effet : l affichage «ne suit pas «l interaction - raison : le rendu n'est pas assez rapide Solutions - afficher moins de choses : dans l espace dans le temps - afficher en mode XOR 100
51 Performance de l affichage Afficher moins de choses dans l'espace - Clipping : réduire la zone d'affichage méthodes rect() et region() de QPaintEvent - "Backing store" ou équivalent 1) copier ce qui ne change pas dans une image 2) afficher cette image dans la zone de dessin 3) afficher la partie qui change par dessus 101 Performance de l affichage Afficher moins de choses dans le temps - sauter les images intermédiaires : réafficher une fois sur deux ou selon l'heure - les timers peuvent être utiles (cf. QTimer) événements void mousemoveevent(qmouseevent* e)... if (delay < MAX_DELAY) update(); boucle de gestion des événements void paintevent(qpaintevent* e) { if (delay > MAX_DELAY) return;... Ne pas réafficher si le délai est trop long Suivant le cas (et le toolkit), test dans une de ces 2 fonctions 102
52 XOR Principe - affichage en mode XOR très efficace pour déplacements interactifs Afficher 2 fois pour effacer - 1er affichage: pixel = bg ^ fg - 2eme affichage: pixel = (bg ^ fg) ^ fg = bg Problèmes - couleurs aléatoires - plus disponible avec Qt4 Exemple Java Graphics : - setcolor(color c1) - setpaintmode() : dessine avec c1 - setxormode(color c2) : échange c1 et c2 103 Qt Designer Fichiers calculator.pro calculator.ui calculator.h calculator.cpp main.cpp calculator.ui fichier XML Exemple vidéo et code.ui calculator.pro TEMPLATE = app FORMS = calculator.ui SOURCES = main.cpp HEADERS = calculator.h 104
53 Qt Designer main.cpp #include "calculator.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Calculator widget; widget.show(); return app.exec(); 105 Qt Designer #include "ui_calculator.h" calculator.h class Calculator : public QWidget { Q_OBJECT public: private : ; Calculator(QWidget *parent =0); Ui::Calculator * ui; calculator.cpp #include "calculator.h" Calculator::Calculator(Qwidget *parent) : QWidget(parent), ui(new Ui::Calculator) { ui->setupui(this);
54 Lien avec le code source Comment afficher le résultat du calcul dans le Qlabel? spinbox1 spinbox2 label3 107 #include "ui_calculator.h" class Calculator : public QWidget { public: private : Q_OBJECT Calculator(QWidget *parent =0); Ui::Calculator * ui; private slots : ; void on_spinbox1_valuechanged(int value); void on_spinbox2_valuechanged(int value); Auto-connect #include "calculator.h void Calculator::on_spinBox1_valueChanged(int val) { QString res = QString::number(val); // ou: QString res = QString::number(ui->spinBox1->value()); ui->label3->settext(res); // label3 est le nom du widget dans Designer 108
55 Lien avec le code source On peut lier les signaux des objets créés interactivement avec n importe quel slot : par auto-connexion : void on_spinbox1_valuechanged(int) ou via le mode Edition Signaux/Slots de QtCreator 109 Variante Même principe mais en utilisant l héritage multiple #include "ui_calculatorform.h" Class Calculator : public QWidget, private Ui::CalculatorForm { Q_OBJECT public: Calculator(QWidget *parent =0); ; Calculator::Calculator(Qwidget *parent) : Qwidget(parent) { setupui(this); void Calculator::on_spinBox1_valueChanged(int val) { QString res = QString::number(val); label3->settext(res); // au lieu de : ui->label3->settext(res); 110
56 Chargement dynamique #include <QtUiTools> Calculator::Calculator(QWidget *parent) : QWidget(parent) { QUiLoader loader; QFile file(":/forms/calculator.ui"); file.open(qfile::readonly); QWidget * widget = loader.load(&file, this); file.close(); 111 Chargement dynamique class Calculator : public QWidget { Q_OBJECT public: Calculator(QWidget *parent = 0); private: QSpinBox *ui_spinbox1; QSpinBox *ui_spinbox2; QLabel *ui_label1; ;... ui_spinbox1 = qfindchild<qspinbox*>(this, "spinbox1"); ui_spinbox2 = qfindchild<qspinbox*>(this, "spinbox2"); ui_label1 = qfindchild<qlabel*>(this, "label1"); 112
57 Machines à états et modes d interaction 113 Machines à états finis Example : rubber banding (repris de Scott Hudson - CMU) Accept the press for endpoint p1; P2 = P1; Draw line P1-P2; Repeat Erase line P1-P2; P2 = current_position(); Draw line P1-P2; Until release event; Act on line input; Quel est le problème? 114
58 Machines à états finis Rubber banding Accept the press for endpoint p1; P2 = P1; Draw line P1-P2; Repeat Erase line P1-P2; P2 = current_position(); Draw line P1-P2; Until release event; Act on line input; Problème - pas compatible avec la gestion événementielle 115 Rappel : gestion des événements événements boucle de gestion des événements void myslot()... update(); void paintevent(qpaintevent* e) {... Cycle événement / réaffichage - on ne doit pas bloquer ce cycle ni ignorer les (autres) événements 116
59 Machines à états Une solution appropriée pour «maintenir l état»! - simple et efficace pour modéliser les comportements - évite les «spaghettis de callbacks» et la multiplication des variables d état et les erreurs! - passage facile d une représentation visuelle au code source - divers outils, UML, QState Etat Etat de départ Etat final NB: en IHM généralement pas d état final : on revient à l état initial 117 Machines à états Transitions - Représentées par des arcs avec un label : Evénement / Action - Si on est dans l état A et cet événement se produit cette action est effectuée puis on passe dans l état B Mouse_Dn / Draw_Line() A B - Remarque : les actions sont parfois sur les états i.e. quand on entre / sort de l état au lieu d être sur les transitions 118
60 Machines à états Retour à notre «ligne élastique» Accept the press for endpoint p1; A P2 = P1; Draw line P1-P2; Repeat Erase line P1-P2; B P2 = current_position(); Draw line P1-P2; Until release event; C Act on line input; 119 Machines à états Move / B Press / A Release / C Accept the press for endpoint p1; A P2 = P1; Draw line P1-P2; Repeat Erase line P1-P2; B P2 = current_position(); Draw line P1-P2; Until release event; C Act on line input; 120
61 Machines à états Autre exemple : bouton Release / E Enter / C Press-inside / A Leave / B Release / D A: highlight button B: unhighlight button C: highlight button D: do button action E: do nothing 121 Machines à états Remarques - Evénements : de plus ou moins haut niveau peuvent aussi être des timeouts (cf. QTimer) - Gardes condition supplémentaire notation : prédicat : événement / action exemple: button.enabled: press-inside / A 122
62 Machines à états Implémentation - doit être compatible avec la boucle de gestion des événements - peut être faire «en dur» (cf. exemple page suivante) - ou via des tables d états et de transitions - préférer l utilisation d outils existants (e.g. QStateMachine pour Qt) state = start_state; for ( ; ; ) { raw_evt = wait_for_event(); evt = transform_event(raw_evt); state = fsm_transition(state, evt); 123 Machines à états Implémentation «en dur» Move / B Press / A Release / C State fsm_transition(state, event) { switch(state) { case 1: switch(event.kind) { case MouseMove: action_b(); state = 1; state = start_state; for ( ; ; ) { raw_evt = wait_for_event(); evt = transform_event(raw_evt); state = fsm_transition(state, evt); case MouseRelease: action_c() state = 2; break; case 0: switch(eventt.kind) { case... return state; 124
63 SwingStates Implementation Java - Caroline Appert, LRI classe Canvas qui facilite le dessin interactif - exemples d interactions avancées 125 Qt State Machine Qt : State Machine Framework - modèle hiérarchique : StateCharts - basés sur SCXML - permet : groupes d états (hiérarchies) états parallèles (pour éviter l explosion combinatoire) états «historiques» (pour sauver et restaurer l état courant) d injecter ses propres événement, etc. - sert également pour les animations 126
64 Bouton à trois états // créer la machine à états QStateMachine * mac = new QStateMachine( ); QState *s1 = new QState( ); QState *s2 = new QState( ); QState *s3 = new QState( ); // transition de s1 à s2 quand on clique le bouton s1->addtransition(button, SIGNAL(clicked( )), s2); s2->addtransition(button, SIGNAL(clicked( )), s3); s3->addtransition(button, SIGNAL(clicked( )), s1); mac->addstate(s1); mac->addstate(s2); mac->addstate(s3); mac->setinitialstate(s1); // obligatoire! // les actions sont sur les états QObject::connect( s3, SIGNAL(entered( )), window, SLOT(showMaximized( )) ); QObject::connect( s3, SIGNAL(exited( )), window, SLOT(showMinimized( )) ); mac->start( ); // lancer la machine 127 Hiérarchies Avantages - permettent de simplifier les schémas - les états enfants héritent des transitions des états parents Exemple 1 - on rajoute à l exemple précédent un bouton quitbutton qui ferme l application 128
65 Hiérarchies // s11, s12, s13 sont groupés dans s1 QState *s1 = new QState( ); QState *s11 = new QState(s1); QState *s12 = new QState(s1); QState *s13 = new QState(s1); s11->addtransition(button, SIGNAL(clicked( )), s12); etc s1->setinitialstate(s11); // s2 est un étal final QFinalState *s2 = new QFinalState( ); // les enfants de s1 héritent de la transition s1 -> s2 s1->addtransition(quitbutton, SIGNAL(clicked( )), s2); // le signal finished() est émis quand on atteint l état final connect(mac, SIGNAL(finished( )), QApplication::instance( ), SLOT(quit( ))); mac->addstate(s1); mac->addstate(s2); mac->setinitialstate(s1); mac->start( ); 129 Hiérarchies Avantages - permettent de simplifier les schémas - les états enfants héritent des transitions des états parents Exemple 2-4 radio boutons exclusifs - noter les transitions de l'état parent vers les enfants solution «plate» solution hiérarchique 130
66 Hiérarchies avec états parallèles Pour éviter l explosion combinatoire - Exemple : 2 boutons à 2 états (typiquement, 2 check boxes) QState *s1 = new QState(QState::ParallelStates); // on peut à la fois entrer dans s11 et dans s12 QState *s11 = new QState(s1); QState *s12 = new QState(s1); solution «plate» solution hiérarchique 131 Types de transitions Pour les signaux - QSignalTransition : c'est ce qu'on a utilisé jusqu'à présent via : s1->addtransition(button, SIGNAL(clicked( )), s2); Pour les événements - QEventTranslation - QKeyEventTranslation - QMouseEventTransition On peut aussi créer ses propres transitions - en dérivant QAbstractTranslation 132
67 Header «maison» Transitions.h Ce header définit - des fonctions simplifiées pour les cas courants - cas des signaux : QSignalTransition* addtrans( QState* from, QState* to, QObject* sender, const char* signal ) QSignalTransition* addtrans( QState* from, QState* to, QObject* sender, const char* signal, QObject* receiver, const char* slot ) Exemple addtrans(s1, s2, button, SIGNAL(clicked( )), this, SLOT(doIt( ))); - l action est sur la transition : - le slot doit() est appelé quand la transition est franchie button.clicked / this.doit() 133 Transitions sur les événements Evénements quelconques QEventTransition* addeventtrans( QState* from, QState* to, QObject* source, QEvent::Type eventtype ) QEventTransition* addeventtrans( QState* from, QState* to, QObject* source, QEvent::Type eventtype, QObject* receiver, const char* slot ) Exemple addeventtrans(out, in, widget, QEvent::Enter); addeventtrans(in, out, widget, QEvent::Leave ); widget.ente r Note - compatible avec événements ad hoc (définis par le programmeur) in out widget.leave 134
68 Transitions sur les événements Evénements souris - même principe - on peut spécifier les boutons // transition de s1 vers s2 quand le bouton gauche de la souris est pressé sur «canvas» addmousetrans( s1, s2, canvas, QEvent::MouseButtonPress, Qt::LeftButton, this, SLOT(newLine( )) ); addmousetrans( s2, s2, canvas, QEvent::MouseMove, Qt::NoButton, / ATT: NoButton pour MouseMove! this, SLOT(adjustLine( )) ); addmousetrans( s2, s1, canvas, QEvent::MouseButtonRelease, Qt::LeftButton ); 135 Transitions sur les événements Evénements souris (2) - variantes - modifieurs clavier // il faut appuyer LeftButton et RightButton addmousetrans( s1, s2, canvas, QEvent::MouseButtonPress, Qt::LeftButton Qt::RightButton ); // double clic addmousetrans( s1, s2, canvas, QEvent::MouseButtonDblClick, Qt::LeftButton ); // il faut appuyer SHIFT et LeftButton addmousetrans( s1, s2, canvas, QEvent::MouseButtonPress, Qt::LeftButton ) ->setmodifiermask( Qt::ShiftModifier ); 136
69 Transitions sur les événements Implémentation dans Transitions.h // NB: inline nécessaire dans un.h inline void addmousetrans( QState* from, QState* to, { QObject* source, QEvent::Type type, Qt::MouseButton button, QObject* receiver, const char* slot ) QMouseEventTransition* trans = new QMouseEventTransition(source, type, button, from); trans->settargetstate(to); from->addtransition(trans); QObject::connect(trans, SIGNAL(triggered()), receiver, slot); Utilisation addmousetrans( s1, s2, canvas, QEvent::MouseButtonPress, Qt::LeftButton ); 137 Transitions sur les événements Problème addmousetrans( s1, s2, canvas, QEvent::MouseButtonPress, Qt::LeftButton, this, SLOT(newLine( )) ); addmousetrans( s2, s2, canvas, QEvent::MouseMove, Qt::NoButton, this, SLOT(adjustLine( )) ); addmousetrans( s2, s1, canvas, QEvent::MouseButtonRelease, Qt::LeftButton ); newline() et adjustline() n'ont pas de paramètre QEvent! => comment peuvent-elles accéder à la position du curseur? 138
70 Position du curseur Solution 1 QPoint cursorpos(qwidget* w) { return w->mapfromglobal(qcursor::pos( )); - attention : petit décalage possible sur systèmes asynchrones (e.g. X11 en réseau) 139 Position du curseur Solution 2 - variante de addmousetrans( ) - pos contiendra la position du curseur mise à jour à chaque transition QPoint pos; addmousetrans( s2, s2, canvas, QEvent::MouseMove, Qt::NoButton, pos); 140
71 Filtres de transitions Principe - 1) lorsqu'une transition peut être activée sa méthode eventtest( ) est appelée - 2) la transition n'est franchie que si eventtest( ) renvoit true => permet d'ajouter des gardes ou de faire divers traitements class MouseTransition : public QMouseEventTransition { QPoint& _pos; bool eventtest(qevent * e) { if (! QMouseEventTransition::eventTest(e)) return false; // ne pas oublier cette ligne! QEvent* realevent = static_cast<qstatemachine::wrappedevent*>(e)->event( ); // le vrai événement switch (realevent->type( )) { case QEvent::MouseMove: case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: _pos = static_cast<qmouseevent*>(realevent)->pos( ); // sauver la position de la souris return true; // true signifie que l événement déclenche la transition (sinon il est ignoré) ; 141 Activer les transitions programmatiquement Exemple - 4 états correspondant à des modes exclusifs de MaClasse - comment les activer via la fonction : void MaClasse::setMode(int mode) - cette fonction est, typiquement, un slot de MaClasse 142
72 Activer les transitions programmatiquement Exemple - 4 états correspondant à des modes exclusifs de MaClasse - comment les activer via la fonction : void MaClasse::setMode(int mode) Solutions - a) setmode( ) émet des signaux (qu'il faut déclarer) qui activeront des QSignalTransitions - b) setmode( ) envoie des événements ad hoc (qu'il faut définir) sur l'objet qui activeront des QEventTransitions 143 Activer les transitions programmatiquement Exemple - 4 états correspondant à des modes exclusifs de MaClasse - comment les activer via la fonction : void MaClasse::setMode(int mode) Solutions - c) setmode( ) envoie des événements ad hoc sur la machine à états qui activent des transitions ad hoc - facile grâce à Transitions.h! 144
73 Transitions ad hoc Quand on crée la machine // parstate est le parent des autres états addcustomtrans( parstate, leftstate, LEFT_MODE ); addcustomtrans( parstate, rightstate, RIGHT_MODE ); addcustomtrans( parstate, justifystate, JUSTIFY_MODE ); addcustomtrans( parstate, centrestate, CENTRE_MODE ); Dans setmode() void MaClasse::setMode(int mode) { mac.postevent( new CustomEvent(mode) ); // mac est la machine a états 145 Transitions ad hoc Quand on crée la machine // parstate est le parent des autres états addcustomtrans( parstate, leftstate, LEFT_MODE ); addcustomtrans( parstate, rightstate, RIGHT_MODE ); addcustomtrans( parstate, justifystate, JUSTIFY_MODE ); addcustomtrans( parstate, centrestate, CENTRE_MODE ); Dans setmode() void MaClasse::setMode(int mode) { mac.postevent( new CustomEvent(mode) ); // mac est la machine a états - LEFT_MODE, etc. sont des entiers positifs ou (mieux!) une énumération : enum Mode { LEFT_MODE = 100, RIGHT_MODE, JUSTIFY_MODE, CENTRE_MODE ; 146
74 Transitions ad hoc Remarques - on peut envoyer les événements après un délai mac.postdelayedevent( new CustomEvent(mode), delay ); // en milli-secondes Comment ça marche? - CustomEvent dérive de QEvent - spécifie un champ type > QEvent::User (signale un événement ad hoc) - peut-être sous-classée pour faire des choses plus complexes 147 Transitions et propriétés Properties s1->assignproperty( label, "text", "In state s1" ); s1->assignproperty( button, "geometry", QRectF(0, 0, 50, 50) ); Base des animations s1->assignproperty( button, "geometry", QRectF(0, 0, 50, 50) ); s2->assignproperty( button, "geometry", QRectF(0, 0, 100, 100) ); addtrans( s1, s2, button, SIGNAL(clicked( )) ) ->addanimation( new QPropertyAnimation( button, "geometry" ) ); cf. aussi QML - langage déclaratif en JavaScript 148
75 Touch events Initialisation : faire setattribute(qt::wa_accepttouchevents); Redéfinir la méthode event( ) de QWidget bool MyWidget::event(QEvent *e) { switch (e->type( )) { case QEvent::TouchBegin: case QEvent::TouchUpdate: case QEvent::TouchEnd: return touchevent( static_cast<qtouchevent *>(e) ); default: return QWidget::event(e); // fonction non standard à définir Implémenter la méthode touchevent(qtouchevent* e) - doit renvoyer true si l'événement est accepté - a accès aux points et leurs états via e->touchpoints( ) et e->touchpointstates( ) 149 Gestes prédéfinis Initialisation : faire grabgesture(qt::pangesture); grabgesture(qt::pinchgesture); grabgesture(qt::swipegesture); Redéfinir la méthode event( ) de QWidget bool MyWidget::event(QEvent *e) { switch (e->type( )) { case QEvent::Gesture: return gestureevent(static_cast<qgestureevent *>(e)); // fonction à définir default: return QWidget::event(e); 150
76 Gestes Implémenter la méthode gestureevent(qgestureevent* e) bool MyWidget:: gestureevent(qgestureevent *e) { if ((QGesture* gest = e->gesture(qt::swipegesture))) swipetriggered(static_cast<qswipegesture*>(gest));... etc... return true; // fct. non standard à définir On peut aussi créer ses propres gestes - via classe QGestureRecognizer 151 Threads class DTracker : public QThread { Q_OBJECT public: DTracker(const std::string& hostname, int port, int rport); ~DTracker(); public slots: // start() is inherited; signals: void onmessage(const QString &); void onstatechange(int state); private: /// run() is redefined. It is executed in a new thread and serves to get /// the data from the tracker. void run(); ;... Pour lancer le traitement - appeler la méthode start( ) 152
77 Modes d interaction Modifieurs - modifient le comportement usuel - touches Control, Shift, Alt... - boutons de la souris gauche : sélectionner, déplacer, activer droite : menu contextuel - multitouch 1 doigt : comme la souris 2 doigts : défiler la vue, zoomer, pivoter 153 Modes d interaction Cas des écrans tactiles passifs - pas de claviers (en général) => pas de modifieurs ni de raccourcis clavier - pas de boutons de la souris ni de mode «hover» => moins d états interactionnels, ambiguités - alternatives multitouch gestes 3D (accéléromètre, gyroscope, magnétomètre...) Cas des tablettes tactiles - généralement «actives» => présence de boutons modaux - inconvénient : nécessitent un stylet spécial 154
Construction d Interfaces Graphiques
Informatique S7-S9 Module CAI Construction d Interfaces Graphiques Alexis NEDELEC Centre Européen de Réalité Virtuelle Ecole Nationale d Ingénieurs de Brest enib c 2012 [email protected] (ENIB-CERV) Construction
Warren PAULUS Robin GODEFROID. C++ - Interface Graphique avec Visual Studio 2010
C++ - Interface Graphique avec Visual Studio 2010 2010/2011 Mise à jour 1.2 : Installation réussie avec Qt 4.7.3. - Ajout d éléments supplémentaires sur le fonctionnement de «QsplashScreen». - Ajout d
Modéliser ses fenêtres avec Qt Designer
1 sur 20 05/07/2011 18:31 Modéliser ses fenêtres avec Qt Designer Informations sur le tutoriel Auteurs : M@teo21 et Nanoc Difficulté : Licence : Plus d'informations Popularité Visualisations : 1 501 676
La programmation orientée objet et le langage C++
Cours précédents La programmation orientée objet et le langage C++ Pablo Rauzy rauzy @ enst fr pablo.rauzy.name/teaching.html#epu-cpp EISE4 @ Polytech UPMC 22 octobre 2014 Cours 5 Nouveautés du C++ par
Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN [email protected]
Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184 Frédéric BERTIN [email protected] Présentaion : Mobile 3D Graphics API JSR 184 M3G :présentation Package optionnel de l api J2ME. Prend
AUVRAY Clément (168187) HOMBERGER Alexandre (186897) GLADE. Langages, outils et méthodes pour la programmation avancée Page 1 sur 12
GTK+ GLADE Page 1 sur 12 SOMMAIRE INTRO 3 Présentation de GTK+ 3 Présentation de GLADE 3 GTK+ 4 Installation 4 Les Widgets 4 Le système de hiérarchie 5 Les signaux 6 GLADE 7 Installation 7 L interface
MANUEL D UTILISATION PRO-FACE
MANUEL D UTILISATION PRO-FACE SOMMAIRE Chapitre 1 Procédure d utilisation 1. En créant un écran seul..... 2. En créant un écran plus un programme logique.. 1-1 1-2 Chapitre 2 Du début à la fin 1. Guide.....
INTERWRITE Workspace
INTERWRITE Workspace Prêt à fonctionner 1. Allumer le tableau blanc (interrupteur sur le côté). 2. Allumer le vidéoprojecteur (voyant vert). 3. Brancher sur l ordinateur : le câble ou la clé bluetooth
Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère
L'héritage et le polymorphisme en Java Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère En java, toutes les classes sont dérivée de la
INTRODUCTION A JAVA. Fichier en langage machine Exécutable
INTRODUCTION A JAVA JAVA est un langage orienté-objet pur. Il ressemble beaucoup à C++ au niveau de la syntaxe. En revanche, ces deux langages sont très différents dans leur structure (organisation du
HMI target Visu / PLC HMI. Pour réaliser une interface homme machine avec PLC control
HMI target Visu / PLC HMI Pour réaliser une interface homme machine avec PLC control VERSION : 1.4 / PH DATE : 5 Novembre 2014 Sommaire Ce manuel explique de manière pratique les étapes successives pour
Utiliser le logiciel Photofiltre Sommaire
Utiliser le logiciel Photofiltre Sommaire 1. Quelques mots sur l image 2. Obtenir des images numériques 3. Le tableau de bord de logiciel PhotoFiltre 4. Acquérir une image 5. Enregistrer une image 6. Redimensionner
Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars 2014. http://homepages.laas.fr/matthieu/cours/java/java.pdf
Introduction à Java Matthieu Herrb CNRS-LAAS http://homepages.laas.fr/matthieu/cours/java/java.pdf Mars 2014 Plan 1 Concepts 2 Éléments du langage 3 Classes et objets 4 Packages 2/28 Histoire et motivations
Modéliser ses fenêtres avec Qt Designer
Modéliser ses fenêtres avec Qt Designer A force d'écrire le code de vos fenêtres, vous devez peut-être commencer à trouver ça long et répétitif. C'est amusant au début, mais au bout d'un moment on en a
pcon.planner 6 Préparer et présenter une implantation en toute simplicité
pcon.planner 6 Préparer et présenter une implantation en toute simplicité Sommaire 1. Installation :... 3 2. Démarrer le logiciel :... 3 3. Interface :... 3 4. Naviguer :... 4 5. Réaliser une implantation
< Atelier 1 /> Démarrer une application web
MES ANNOTATIONS SONT EN ROUGE : Axel < Atelier 1 /> Démarrer une application web Microsoft France Tutorial Découverte de ASP.NET 2.0 Sommaire 1 INTRODUCTION... 3 1.1 CONTEXTE FONCTIONNEL... 3 1.2 CONTEXTE
Mise en scène d un modèle dans l espace 3D
CHAPITRE 3 Mise en scène d un modèle dans l espace 3D Blender permet de construire des espaces à la manière d une scène de théâtre. Pour cela, il présente dès l ouverture tout ce dont on a besoin : un
SolidWorks edrawings et publications
SolidWorks edrawings et publications Ce tutorial a pour but de vous expliquer ce qu est edrawings et ce que ce format de fichier peut vous rendre comme services, puis de vous expliquer les différentes
SpeechiTablet Notice d utilisation
SpeechiTablet Notice d utilisation Copyright(C) 2003-2009 Speechi Web: www.speechi.net Tel: 03-20-34-74-25 Fax: 03-20-34-74-26 E-mail: [email protected] Version 1.0.0 1. Introduction... 3 1.1. Contenu de
Optimiser pour les appareils mobiles
chapitre 6 Optimiser pour les appareils mobiles 6.1 Créer un site adapté aux terminaux mobiles avec jquery Mobile... 217 6.2 Transformer son site mobile en application native grâce à PhoneGap:Build...
Sélection du contrôleur
Démo CoDeSys - 1 - 1. Configuration de l environnement de travail : Lancer le logiciel CoDeSys Fichier Nouveau Lors de la première utilisation, une boîte de dialogue apparaît permettant la sélection du
COMMENCER AVEC VUE. Chapitre 1
Chapitre 1 COMMENCER AVEC VUE Traduction en français du premier chapitre du manuel d'utilisation du logiciel VUE. Traduit de l'américain par Bernard Aubanel. CRÉER UNE NOUVELLE CARTE Pour ouvrir VUE: 1.
1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.
1. Structure d un programme C Un programme est un ensemble de fonctions. La fonction "main" constitue le point d entrée pour l exécution. Un exemple simple : #include int main() { printf ( this
Tutoriel code::blocks
Tutoriel code::blocks E. Lunéville 2006 Le logiciel code::blocks fait partie des logiciels de type EDI (Environnement de Développement Intégré, IDE en anglais) pour le langage C++. Il est multiplateforme
Cours iguess. inotes v10.1
Cours iguess inotes v10.1 Ce projet a été financé avec le soutien de la Commission européenne. Cette publication (communication) n engage que son auteur et la Commission n est pas responsable de l usage
Manipulation 4 : Application de «Change».
Manipulation 4 : Application de «Change». Première partie : Cette manipulation a pour but d utiliser un service Web afin d obtenir les taux de change appliqués entre les différentes monnaies référencées
Note de cours. Introduction à Excel 2007
Note de cours Introduction à Excel 2007 par Armande Pinette Cégep du Vieux Montréal Excel 2007 Page: 2 de 47 Table des matières Comment aller chercher un document sur CVMVirtuel?... 8 Souris... 8 Clavier
l'ordinateur les bases
l'ordinateur les bases Démarrage de l'ordinateur - Le bureau, mon espace de travail - J'utilise la souris - Ouvertes ou fermées, les fenêtres - Dans l'ordinateur, tout est fichier - Le clavier : écrire,
Chapitre VI- La validation de la composition.
Chapitre VI- La validation de la composition. Objectifs du chapitre : Expliquer les conséquences de l utilisation de règles de typage souples dans SEP. Présenter le mécanisme de validation des connexions
Architecture générale des interfaces graphiques. IHM: Fondements des Interfaces Graphiques. Applications. Outils de construction d interfaces
Architecture générale des interfaces graphiques Applications IHM: Fondements des Interfaces Graphiques Olivier Chapuis [email protected] Outils de construction d interfaces Bibliothèque graphique Système
13) Calibrage du tableau Interwrite Dualboard
13) Calibrage du tableau Interwrite Dualboard Le calibrage permet d ajuster avec précision la pointe de votre stylet avec le pointeur de l ordinateur. 2 façons de calibrer le tableau Interwrite Dualboard
Android 4 Les fondamentaux du développement d'applications Java
La plateforme Android 1. Présentation 13 2. Historique 14 3. Google Play 15 3.1 Création d'un compte développeur 16 3.2 Publication d'une application 16 3.3 Suivi et mise à jour d'une application 18 Environnement
Formation. Module WEB 4.1. Support de cours
Formation Module WEB 4.1 Support de cours Rédacteur Date de rédaction F.CHEA 08/02/2012 Les informations contenues dans ce document pourront faire l'objet de modifications sans préavis Sauf mention contraire,
BIRT (Business Intelligence and Reporting Tools)
BIRT (Business Intelligence and Reporting Tools) Introduction Cette publication a pour objectif de présenter l outil de reporting BIRT, dans le cadre de l unité de valeur «Data Warehouse et Outils Décisionnels»
Introduction : Cadkey
Introduction Cadkey Cadkey est un logiciel de dessin assisté par ordinateur. La fenêtre du logiciel devrait ressembler à quelque chose comme suit: Le menu supérieur: Redraw Autoscale Efface Modifier les
Cours de Génie Logiciel
Cours de Génie Logiciel Sciences-U Lyon Diagrammes UML (2) http://www.rzo.free.fr Pierre PARREND 1 Avril 2005 Sommaire Les Diagrammes UML Diagrammes de Collaboration Diagrammes d'etats-transitions Diagrammes
MEGA ITSM Accelerator. Guide de Démarrage
MEGA ITSM Accelerator Guide de Démarrage MEGA 2009 SP4 1ère édition (juin 2010) Les informations contenues dans ce document pourront faire l objet de modifications sans préavis et ne sauraient en aucune
Introduction au langage C
Introduction au langage C Cours 1: Opérations de base et premier programme Alexis Lechervy Alexis Lechervy (UNICAEN) Introduction au langage C 1 / 23 Les premiers pas Sommaire 1 Les premiers pas 2 Les
1 INTRODUCTION. PowerBuilder - Introduction. Pascal Buguet Imprimé le 19 août 2004 Page 1
1 INTRODUCTION 1 INTRODUCTION... 1 1.1 A quoi sert Power Builder?... 2 1.2 Principaux Concepts... 4 1.3 Une première application... 6 1.3.1 Création du Workspace... 7 1.3.2 Création de l application...
Alfstore workflow framework Spécification technique
Alfstore workflow framework Spécification technique Version 0.91 (2012-08-03) www.alfstore.com Email: [email protected] Alfstore workflow framework 2012-10-28 1/28 Historique des versions Version Date
Malgré son aspect spartiate, Freeplane offre de nombreuses fonctionnalités en particulier dans le domaine de la diffusion des cartes sur le Web.
Création d une carte heuristique avec Freeplane Version : 1.1.3 Barre de menus Barre d outils Barre des touches de fonctions Espace de travail Barre d icônes Éditeur de notes Freeplane est un logiciel
Conservez la documentation à portée de main pour toute référence future. Le terme «pointeur» dans ce manuel désigne le pointeur interactif YA-P10.
Presentation Draw F Mode d emploi Conservez la documentation à portée de main pour toute référence future. Le terme «pointeur» dans ce manuel désigne le pointeur interactif YA-P10. Microsoft, Windows et
Introduction 2 - Précaution 2 - Caractéristiques techniques 2 - Contenu 3
Tablette:Mise en page 1 23/09/2011 09:15 Page 1 SOMMAIRE Introduction 2 - Précaution 2 - Caractéristiques techniques 2 - Contenu 3 Prise en main 4 - Installer la pile dans le stylet 4 - Changer la pointe
TP1 : Initiation à Java et Eclipse
TP1 : Initiation à Java et Eclipse 1 TP1 : Initiation à Java et Eclipse Systèmes d Exploitation Avancés I. Objectifs du TP Ce TP est une introduction au langage Java. Il vous permettra de comprendre les
Unity. Moteur de jeu 3D et 2D. Cross platform: Windows, Mac, Linux, ios, Android, Blackberry, Xbox, Playstation, Wii
Unity Moteur de jeu 3D et 2D Cross platform: Windows, Mac, Linux, ios, Android, Blackberry, Xbox, Playstation, Wii C# / Javascript (UnityScript) / Boo Possibilité de créer ses propres outils Programmation
1. Introduction... 2. 2. Création d'une macro autonome... 2. 3. Exécuter la macro pas à pas... 5. 4. Modifier une macro... 5
1. Introduction... 2 2. Création d'une macro autonome... 2 3. Exécuter la macro pas à pas... 5 4. Modifier une macro... 5 5. Création d'une macro associée à un formulaire... 6 6. Exécuter des actions en
Paramètres d accessibilité des systèmes d exploitation Windows et Mac
Paramètres d accessibilité des systèmes d exploitation Windows et Mac Hôpital Raymond Poincaré 104, Bd Raymond Poincaré 92380 Garches GB Consulting 242 rue du Faubourg de Roubaix 59800 Lille Samuel POUPLIN
TP2 : Client d une BDD SqlServer
TP2 : Client d une BDD SqlServer Objectifs : utiliser la barre de menu, utiliser les préférences d application (settings) ou (options), gérer la persistance des données, utiliser la bibliothèque jtds:jdbc
L ORDINATEUR FACILE D ACCÈS!
L ORDINATEUR FACILE D ACCÈS! Préparé par Éric Roussel, enseignant spécialisé en informatique / École Jacques-Ouellette / 2009 Préambule Il est important de noter qu il n y a pas d adaptation parfaite des
Formation VBA 3 Interagir
Formation VBA 3 Interagir 1 Utilisation des UserForms Les UserForms sont des interfaces largement configurables, il convient de ne pas les limiter à tel ou tel usage qui pourrait être présenté à titre
L espace de travail de Photoshop
L espace de travail de Photoshop 1 Au cours de cette leçon, vous apprendrez à : ouvrir les fichiers Photoshop ; sélectionner et employer certains des outils dans le panneau Outils ; définir les options
Licence ST Université Claude Bernard Lyon I LIF1 : Algorithmique et Programmation C Bases du langage C 1 Conclusion de la dernière fois Introduction de l algorithmique générale pour permettre de traiter
Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework
Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework Gaël de Chalendar CEA LIST / LIC2M Journée de Présentation des Technologies WebContent INSTN 14/12/2009 Présentation de gsoap Plan
Interfaces graphiques avec l API Swing
Interfaces graphiques avec l API Swing Les Swing Les classes graphiques Swing dérivent de la classe JComponent, qui hérite ellemême de la classe AWT (Abstract Window Toolkit). Tous les composants Swing
Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, 2000-2015, ISBN : 978-2-212-14154-2
Anne Tasso Java Le livre de premier langage 10 e édition Avec 109 exercices corrigés Groupe Eyrolles, 2000-2015, ISBN : 978-2-212-14154-2 Table des matières Avant-propos Organisation de l ouvrage..............................
2 Grad Info Soir Langage C++ Juin 2007. Projet BANQUE
2 Grad Info Soir Langage C++ Juin 2007 Projet BANQUE 1. Explications L'examen comprend un projet à réaliser à domicile et à documenter : - structure des données, - objets utilisés, - relations de dépendance
Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java
Info0101 Intro. à l'algorithmique et à la programmation Cours 3 Le langage Java Pierre Delisle, Cyril Rabat et Christophe Jaillet Université de Reims Champagne-Ardenne Département de Mathématiques et Informatique
ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A.
ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A. - 1 - PREAMBULE Les conditions générales d utilisation détaillant l ensemble des dispositions applicables
C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement
C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement des objets d'une classe Utilisation d'une classe Droit
Avant-propos FICHES PRATIQUES EXERCICES DE PRISE EN MAIN CAS PRATIQUES
Avant-propos Conçu par des pédagogues expérimentés, son originalité est d être à la fois un manuel de formation et un manuel de référence complet présentant les bonnes pratiques d utilisation. FICHES PRATIQUES
www.imprimermonlivre.com
0 www.imprimermonlivre.com Composition d une couverture avec Word L objectif de ce guide est de vous proposer un mode opératoire pour créer une couverture avec Word. Nous vous rappelons toutefois que Word
Programmation système I Les entrées/sorties
Programmation système I Les entrées/sorties DUT 1 re année Université de Marne La vallée Les entrées-sorties : E/O Entrées/Sorties : Opérations d échanges d informations dans un système informatique. Les
Interface PC Vivago Ultra. Pro. Guide d'utilisation
Interface PC Vivago Ultra Pro Guide d'utilisation Version 1.03 Configuration de l'interface PC Vivago Ultra Configuration requise Avant d'installer Vivago Ultra sur votre ordinateur assurez-vous que celui-ci
Initiation à JAVA et à la programmation objet. [email protected]
Initiation à JAVA et à la programmation objet [email protected] O b j e c t i f s Découvrir un langage de programmation objet. Découvrir l'environnement java Découvrir les concepts de la programmation
GUIDE Excel (version débutante) Version 2013
Table des matières GUIDE Excel (version débutante) Version 2013 1. Créer un nouveau document Excel... 3 2. Modifier un document Excel... 3 3. La fenêtre Excel... 4 4. Les rubans... 4 5. Saisir du texte
Ceci est un Chromebook, ton ordinateur!
Ceci est un Chromebook, ton ordinateur! CHROMEBOOK - Dans le royaume des ordinateurs personnels, il n'y a pas beaucoup de choix. Pour schématiser, soit vous avez un PC, soit vous avez un Mac. Et ce depuis
Table des matières Introduction... 1 1. Démarrage... 8 2. Les composants graphiques... 26
Table des matières À propos de l'auteur... x Préface... xi Avant-propos... xiv 1. Public visé et prérequis... xiv 2. Sources des exemples... xv 3. Accès aux vidéos... xv 4. URL raccourcies... xv 5. Remerciements...
Qualité du logiciel: Méthodes de test
Qualité du logiciel: Méthodes de test Matthieu Amiguet 2004 2005 Analyse statique de code Analyse statique de code Étudier le programme source sans exécution Généralement réalisée avant les tests d exécution
Installation et paramétrage. Accès aux modèles, autotextes et clip- art partagés
DSI Documentation utilisateurs Installation et paramétrage Accès aux modèles, autotextes et clip- art partagés Auteur : Yves Crausaz Date : 21 septembre 2006 Version : 1.04 Glossaire OOo : Abréviation
TP Blender n 2 : Importation d un modèle SketchUp et animation
TP Blender n 2 : Importation d un modèle SketchUp et animation Service de Conception Géométrique Université de Liège Aérospatiale et Mécanique Conçu avec Blender 2.66 et SketchUp 8 De SketchUp à Blender
MEMENTO D'UTILISATION Du T.N.I. SmartBoard (Version 10.0.130)
CRDP de l académie de Versailles Mission TICE Médiapôles mediapoles @crdp.ac-versailles.fr MEMENTO D'UTILISATION Du T.N.I. SmartBoard (Version 10.0.130) Mars 2009 584, rue Fourny 78530 Buc Tél. 01 39 45
Construire des plug-ins pour SAS Management Console SAS 9.1
Construire des plug-ins pour SAS Management Console SAS 9.1 Janvier 2005 Sommaire 1 INTRODUCTION... 3 1.1 OBJECTIFS... 3 1.2 PERIMETRE... 3 2 LES COMPOSANTS DE SAS MANAGEMENT CONSOLE... 4 3 LA CONSTRUCTION
Studio. HERITIER Emmanuelle PERSYN Elodie. SCHMUTZ Amandine SCHWEITZER Guillaume
Studio HERITIER Emmanuelle PERSYN Elodie SCHMUTZ Amandine SCHWEITZER Guillaume Cours R Présentation projet 10/10/2013 Introduction RStudio est une interface créé par JJ Allaire Elle est sortie le 11 Février
PRISE EN MAIN D UN TABLEUR. Version OPEN OFFICE
PRISE EN MAIN D UN TABLEUR Version OPEN OFFICE Prise en main d un tableur page 2 1. L utilisation de la souris Pour faire fonctionner un tableur, on utilise le clavier mais aussi la souris. Rappelons,
Support de formation Notebook
Support de formation Notebook Guide de l utilisateur du tableau interactif SMART Board Table des matières Le Tableau Blanc Interactif... 1 Comprendre le fonctionnement du TBI... 1 Utiliser le plumier
Projet Matlab : un logiciel de cryptage
Projet Matlab : un logiciel de cryptage La stéganographie (du grec steganos : couvert et graphein : écriture) consiste à dissimuler une information au sein d'une autre à caractère anodin, de sorte que
Créer et partager des fichiers
Créer et partager des fichiers Le rôle Services de fichiers... 246 Les autorisations de fichiers NTFS... 255 Recherche de comptes d utilisateurs et d ordinateurs dans Active Directory... 262 Délégation
TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile
TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile Dans ce TP, vous apprendrez à définir le type abstrait Pile, à le programmer en Java à l aide d une interface
Sage 100 CRM Guide de l Import Plus avec Talend Version 8. Mise à jour : 2015 version 8
Sage 100 CRM Guide de l Import Plus avec Talend Version 8 Mise à jour : 2015 version 8 Composition du progiciel Votre progiciel est composé d un boîtier de rangement comprenant : le cédérom sur lequel
Form Designer Guide d utilisateur DOC-FD-UG-FR-01/01/12
Form Designer Guide d utilisateur DOC-FD-UG-FR-01/01/12 Les informations contenues dans le présent manuel de documentation ne sont pas contractuelles et peuvent faire l objet de modifications sans préavis.
Bases de programmation. Cours 5. Structurer les données
Bases de programmation. Cours 5. Structurer les données Pierre Boudes 1 er décembre 2014 This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License. Types char et
Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004
Questionnaire d'examen final INF1101 Sigle du cours Nom : Signature : Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004 Professeur(s)
L alternative, c est malin 1. Comment faire plein de choses pour pas cher sur MacIntosh
L alternative, c est malin 1 ou Comment faire plein de choses pour pas cher sur MacIntosh (Les logiciels : Pages et Keynote de la suite iwork) (Jean Aboudarham 2006) 1 Merci à François Béranger pour qui
Rapport de Mini-Projet en ArcGIS Engine
Rapport de Mini-Projet en ArcGIS Engine Réalisée par : Asmae BENMESSAOUD 3ème Année Cycle d Ingénieur Géoinformation Année Universitaire 2010- Sommaire 1 Introduction L analyse géographique et la visualisation
Spécifications techniques
Spécifications techniques Décembre2009 1. Récapitulatif des formats : p2 1. Formats classiques p2 2. Formats Rich Média p2 2. Emplacements : p3 1. Directions.fr p3 2. Newsletter Directions p4 3. Contraintes
Parcours FOAD Formation EXCEL 2010
Parcours FOAD Formation EXCEL 2010 PLATE-FORME E-LEARNING DELTA ANNEE SCOLAIRE 2013/2014 Pôle national de compétences FOAD Formation Ouverte et A Distance https://foad.orion.education.fr Livret de formation
Comment accéder à d Internet Explorer
Comment accéder à d Pour ouvrir l application, vous n avez qu à doublecliquer sur l icône de celle-ci : ou vous pouvez encore allez le chercher par le raccourci dans la barre des tâches : Lorsque l application
Tutorial Terminal Server sous
Tutorial Terminal Server sous réalisé par Olivier BOHER Adresse @mail : [email protected] Site Internet : http://xenon33.free.fr/ Tutorial version 1a Page 1 sur 1 Index 1. Installation des services Terminal
Bases Java - Eclipse / Netbeans
Institut Galilée PDJ Année 2014-2015 Master 1 Environnements Java T.P. 1 Bases Java - Eclipse / Netbeans Il existe plusieurs environnements Java. Il est ESSENTIEL d utiliser la bonne version, et un environnement
L'architecture MVC avec les widgets complexes
L'architecture MVC avec les widgets complexes Nous attaquons maintenant un des chapitres les plus intéressants de ce cours sur Qt, mais aussi un des plus difficiles. Dans ce chapitre, nous apprendrons
Access 2007 FF Access FR FR Base
ACCESS Basic Albertlaan 88 Avenue Albert Brussel B-1190 Bruxelles T +32 2 340 05 70 F +32 2 340 05 75 E-mail [email protected] Website www.keyjob-training.com BTW TVA BE 0425 439 228 Access 2007
Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet
Programmation VBA Pierre BONNET 21 La programmation VBA Historiquement, la programmation sous Excel avait comme fonction d'automatiser une succession d'actions faites dans la feuille à l'aide de la souris.
Présentation de Firefox
Présentation de Firefox A l ouverture la fenêtre ressemble a ceci. (A noter qu ici j ai ouvert la page d accueil GOOGLE) Firefox présente toutes les fonctionnalités de base d un navigateur comme Internet
Plan du cours. Historique du langage http://www.oracle.com/technetwork/java/index.html. Nouveautés de Java 7
Université Lumière Lyon 2 Faculté de Sciences Economiques et Gestion KHARKIV National University of Economic Introduction au Langage Java Master Informatique 1 ère année Julien Velcin http://mediamining.univ-lyon2.fr/velcin
Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :
Développement d un client REST, l application Vélib 1. Présentation L application présentée permet de visualiser les disponibilités des vélos et des emplacements de parking à la disposition des parisiens
Modifier les propriétés d'un widget
La "fenêtre-bouton" que nous avons réalisée dans le chapitre précédent était un premier pas. Certaines question se posent naturellement : Par exemple, comment modifier la taille du bouton? Comment placer
SHERLOCK 7. Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5
SHERLOCK 7 Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5 Cette note montre comment intégrer un script Java dans une investigation Sherlock et les différents aspects de Java script. S T E M M E R I M A G I N
Mes premiers diaporamas avec Open Office Impress?
Mes premiers diaporamas avec Open Office Impress? Courage! Tu vas y arriver 1 Sommaire I. Les bons gestes avant de lancer Open Office (page 3) II. Créer un dossier Open Office. (page 4) III. Les 5 zones
Dessiner dans Galaad FRANÇOIS PALLUT
Dessiner dans Galaad FRANÇOIS PALLUT Paternité - Pas d'utilisation Commerciale - Pas de Modification : http://creativecommons.org/licenses/by-nc-nd/2.0/fr/ Table des matières Objectifs 5 Introduction 7
