Manipulations 2 Objectifs... 2 Mise en situation... 2



Documents pareils
Warren PAULUS Robin GODEFROID. C++ - Interface Graphique avec Visual Studio 2010

Construction d Interfaces Graphiques

Modéliser ses fenêtres avec Qt Designer

IHM2. Eric Lecolinet - Télécom ParisTech 1. Toolkit graphique Qt Dessin interactif. Machines à états.

Modéliser ses fenêtres avec Qt Designer

Introduction au langage C

RACCOURCIS CLAVIERS. DEFINITION : Une «combinaison de touches» est un appui simultané sur plusieurs touches.


Le langage C. Séance n 4

Quelques éléments de compilation en C et makefiles

Créer le schéma relationnel d une base de données ACCESS

PAGE 1. L écran du logiciel d Open Office Draw. Barre de menu: Les commandes du logiciel

GUIDE Excel (version débutante) Version 2013

Modifier les propriétés d'un widget

Formation. Module WEB 4.1. Support de cours

Comment accéder à d Internet Explorer

Guide de démarrage rapide. (pour la version 5.0.)

TD/TP 1 Introduction au SDK d Android

USTL - Licence ST-A 1ère année Codage de l information TP 1 :

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

TP : Gestion d une image au format PGM

Manuel utilisateur «VisioJeunes»

1. Développement embarqué. André KPOZEHOUE DOMAINES DE COMPETENCES CONNAISSANCES TECHNIQUES

Once the installation is complete, you can delete the temporary Zip files..

Suivant les windows, le signal pour indiquer l imprimante par défaut est un petit rond noir ou vers avec un V à l intérieur.

TP1 : Initiation à Java et Eclipse

Your Detecting Connection. Manuel de l utilisateur. support@xchange2.net

Guide de l administrateur DOC-OEMCS8-GA-FR-29/09/05

Introduction à Eclipse

Guide d utilisation du service de transfert sécurisé de fichiers. Édition du 3 octobre 2011

PG208, Projet n 3 : Serveur HTTP évolué

MANUEL TBI - INTERWRITE

Numérisation. Copieur-imprimante WorkCentre C2424

Guide d utilisation WEBPORTAL CPEM Portail d Applications Web CPEM

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Création et utilisation de formulaire pdf

Mise en scène d un modèle dans l espace 3D

Programmation C. Apprendre à développer des programmes simples dans le langage C

Back up Server DOC-OEMSPP-S/6-BUS-FR-17/05/11

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Algorithmique et Programmation, IMA

Connecteur Zimbra pour Outlook 2007 et 2010 (ZCO) w

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

MEGA ITSM Accelerator. Guide de démarrage

Installation du logiciel Windows Suivant Démarrer Tous les programmes Démarrer Tous les programmes Marketing Manager Marketing Manager Linux ici Mac

Création WEB avec DreamweaverMX

Découvrez Windows NetMeeting

Tapez le titre de la page «BASTIA ville méditerranéenne», puis allez deux fois à la ligne à l aide de la touche Entrée.

Cours Langage C/C++ Programmation modulaire

Direction des technologies de l information GUIDE D UTILISATION PAPERCUT À L INTENTION DES ÉTUDIANTS

Programmation par les Objets en Java

Caisses Sociales de Monaco - Déclarations de Salaires DIDACTICIEL. Version 3.2

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

TP2 : Client d une BDD SqlServer

< Atelier 1 /> Démarrer une application web

Chapitre VI- La validation de la composition.

Manuel d utilisation de l outil collaboratif

Comment se servir de l utilitaire de validation?

ACCUEIL / Introduction. Introduction. Présentation de StarBoard Software Éléments de l écran Guide de démarrage rapide

MEGA ITSM Accelerator. Guide de Démarrage


Avenir Concept Monaco

FICHIERS ET DOSSIERS

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

Si vous décidez d utiliser un autre chemin, c est ce nouveau chemin qu il faudra prendre en compte pour la sauvegarde. Cf. : Chapitre 9 Sauvegarde

Utiliser le logiciel Photofiltre Sommaire

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

L'émulateur multi-système

L'architecture MVC avec les widgets complexes

Utilisation du logiciel Epson Easy Interactive Tools

italc supervision de salle

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage 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

Construire des plug-ins pour SAS Management Console SAS 9.1

Introduction à C++ et à wxwidgets

TD de supervision. J.P. Chemla. Polytech Tours Département productique 2ème année

L espace de travail de Photoshop

Comment mettre en page votre livre

AUVRAY Clément (168187) HOMBERGER Alexandre (186897) GLADE. Langages, outils et méthodes pour la programmation avancée Page 1 sur 12

Utiliser Dev-C++ .1Installation de Dev-C++ Table des matières

Utilisation de la clé USB et autres supports de stockages amovibles

Formation pour les parents Se familiariser avec la tablette ipad et les applications d apprentissage pour enfants

Dans l idéal, ceci devrait être fait en amont pour chaque image envoyée sur l espace de stockage de votre site internet.

E-Remises Paramétrage des navigateurs

Méthode de préparation du fichier texte d import depuis Excel, via Access jusqu à Drupal.

Tutoriel code::blocks

TUTORIEL IMPRESS. Ouvrir Impress cocher «présentation vierge», «suivant» cocher «écran», «suivant» cocher «standard», «créer»

Chaque ordinateur est constitué de différentes unités de stockage de données (Disque dur, Graveur ) que l on peut imaginer comme de grandes armoires.

Comment générer un fichier PDF de qualité et certifié imprimable?

La mémoire. Un ordinateur. L'octet. Le bit

ENVOI SIMPLE (SMS)...

1.1 L EXPLORATEUR WINDOWS

L accès à distance du serveur

Fonctionnement de Windows XP Mode avec Windows Virtual PC

Certificats Electroniques sur Clé USB

Créer un modèle Impress

Chapitre 22 Optimisation pour diffusion à l'écran, pour le web

Guide de configuration. Logiciel de courriel

Transcription:

TP Qt : Code-barre 2012 tv <tvaira@free.fr> - v.1.0 - le 11 juin 2012 Sommaire Manipulations 2 Objectifs................................................ 2 Mise en situation........................................... 2 Travail demandé 2 Itération 1............................................... 2 Itération 2............................................... 7 Le code 39............................................ 7 Le dessin 2D........................................... 9 Mise en oeuvre du code-barre................................. 11 Il est fortement conseillé d utiliser la documentation Qt de référence en français (http://qt.developpez.com/doc/) ou en anglais (http://qt-project.org/doc/). 1

Manipulations Objectifs Les objectifs de ce tp sont : utilisation de quelques widgets mise en oeuvre du dessin et de l impression dans Qt Mise en situation Dans ce tp, on vous propose de développer une application graphique en Qt en utilisant des widgets permettant de générer et imprimer des code-barres (fr.wikipedia.org/wiki/code_barre) Code39 (fr.wikipedia.org/wiki/code_39). On va développer l application en deux itérations. Remarque : un développement itératif s organise en une série de développement très courts de durée fixe nommée itérations. Le résultat de chaque itération est un système partiel exécutable, testé et intégré (mais incomplet). Travail demandé Itération 1 Dans cette première itération, on s attachera à créer sa propre boîte de dialogue en créant une nouvelle classe MyDialog qui héritera de la classe QDialog. Une instance de cette classe représentera la fenêtre de l application : #include <QApplication> #include "mydialog.h" TP Qt : Code-barre 2 / 12 2012 tv <tvaira@free.fr>

int main( int argc, char **argv ) QApplication a( argc, argv ); MyDialog w; w.show(); } return a.exec(); Code 1 main.cpp Et on obtiendra alors l affichage suivant : Le fonctionnement de l application est assez simple : le bouton Générer assure le dessin du code-barre à l écran et valide la possibilité de l imprimer le bouton Imprimer assure l impression du code-barre vers l imprimante choisie le bouton Quitter permet de terminer l application TP Qt : Code-barre 3 / 12 2012 tv <tvaira@free.fr>

La classe MyDialog devra intégrer les différents éléments graphiques suivants : Vous devez définir un positionnement de ces widgets avec des layouts afin de respecter l affichage fourni dans la capture d écran ci-dessus. L instanciation des widgets et leur positionnement se fera dans le constructeur de la classe MyDialog (voir Code 4). Pour gérer les évenements et les actions entre l utilisateur et l application ou entre les widgets de l application, Qt utlise un mécanisme d évènements (signaux) et de récepteurs (slots). Chaque objet du programme (qui hérite de QObject et qui contient l appel à la macro Q_OBJECT dans sa déclaration) peut émettre des signaux et proposer des slots de réception. Il suffit ensuite de connecter les signaux aux slots pour obtenir le déclenchement d une action en présence d un évènement. Ce mécanisme puissant permet aux différents objets de l application de communiquer entre-eux de façon simple sans avoir à maintenir en permanence des références entre eux. TP Qt : Code-barre 4 / 12 2012 tv <tvaira@free.fr>

Dans notre situation, il faudra assurer au minimum la gestion des évèments et le déclenchement des actions représentées dans la capture d écran ci-dessus. Le code-barre saisi dans un QLineEdit et le texte associé au QLabel sont de type QString. Question 1. Assurer la fabrication de l application. Afin de simplifier la fabrication, Qt offre l utilitaire qmake qui permet de générer un fichier Makefile à partir d un fichier projet (extension pro). Un fichier projet décrit les fichiers qui composent le programme (fichiers sources, headers,...) et certaines options de construction (bibliothèques,...). Pour ce tp, le fichier.pro généré par qmake sera le suivant : ###################################################################### # Automatically generated by qmake (2.01a) dim. fvr. 5 16:14:41 2012 ###################################################################### TEMPLATE = app TARGET = codebarre DEPENDPATH +=. INCLUDEPATH +=. # Input HEADERS += mydialog.h generateurcodebarre.h SOURCES += main.cpp mydialog.cpp generateurcodebarre.cpp Code 2 codebarre.pro Les différentes étapes pour fabriquer l application demandée (sous GNU/Linux) sont : Étape 1. Créer un répertoire codebarre. Étape 2. Copier les fichiers fournis (main.cpp, mydialog.h et mydialog.cpp) dans le répertoire codebarre. Étape 3. Compléter les fichiers fournis (mydialog.h et mydialog.cpp) : travail effectué aux questions 2 et 3. Étape 4. Générer le fichier de projet codebarre.pro en utilisant qmake dans le répertoire contenant les sources à compiler. $ qmake -project Étape 5. Générer le fichier Makefile en utilisant qmake dans le répertoire contenant les sources à compiler. $ qmake Étape 6. Fabiquer l application en utilisant make ou mingw32-make sous Windows. $ make TP Qt : Code-barre 5 / 12 2012 tv <tvaira@free.fr>

Étape 7. Tester l application fabriquée. $./cesar Question 2. Compléter la déclaration de la classe MyDialog. #ifndef MYDIALOG_H #define MYDIALOG_H #include <QtGui> class GenerateurCodeBarre; class MyDialog : public QDialog Q_OBJECT public: MyDialog( QWidget *parent = 0 ); private: QLineEdit QLabel *codebarre; *valeur; QPushButton *bgenerer; QPushButton *bimprimer; QPushButton *bquitter; GenerateurCodeBarre *generateurcodebarre; QIntValidator *intvalidator; }; private slots: void generer(); void imprimer(); #endif Code 3 mydialog.h Question 3. Compléter la définition de la classe MyDialog. #include <QtGui> #include "mydialog.h" #include "generateurcodebarre.h" MyDialog::MyDialog( QWidget *parent ) : QDialog( parent ) valeur = new QLabel(this); TP Qt : Code-barre 6 / 12 2012 tv <tvaira@free.fr>

valeur->settext("code barre :"); // TODO } setwindowtitle(tr("tp codebarre")); setfixedheight(sizehint().height()); void MyDialog::generer() // TODO } void MyDialog::imprimer() // TODO } Code 4 mydialog.cpp Question 4. Fabriquer l application et tester. Itération 2 Une fois l itération 1 validée, on passe à la seconde itération qui a pour but de finaliser l application. Remarque : dans un processus de développement itératif et incrémental, chaque développement s ajoute et enrichit l existant. Normalement, la nouvelle itération écrase la précédente et son numéro de version est incrémenté. Il est conseillé de conserver une copie fonctionnelle de l itération 1. Dans certains cas, c est une position de repli intéressante. Le code 39 Le code 39 est un code alphanumérique permettant de coder dans sa version d origine 43 caractères, c est-à-dire les chiffres de 0 à 9, les lettres de A à Z, 6 symboles y compris l espace, plus un caractère particulier de début et fin de message (*). Un caractère particulier est utilisé pour marquer le début et la fin du symbole. Ce caractère est habituellement interprété par un astérisque (*), et n est pas transmis lors de la lecture. Un symbole en code 39 se compose donc de : Un espace blanc Le caractère de début de message Les caractères du message proprement dit Le caractère de fin de message Un espace blanc TP Qt : Code-barre 7 / 12 2012 tv <tvaira@free.fr>

Remarques : Il faut noter que les espaces blancs précédant le symbole lui-même sont indispensables pour la lecture. Le cas échéant, si l utilisateur le souhaite, une clé de contrôle peut être ajoutée au message. Chaque caractère est composé de 9 éléments : 5 barres (noir) et 4 espaces (blanc). Chaque barre ou espace est large (représentant un bit à 1) ou étroit (représentant un bit à 0). Le codage de chaque caractère est donc la succession de 9 bits dont exactement 3 sont à 1 (barre large). Par exemple, voici les codes pour les valeurs de 0 à 9 : 0 000110100 (0x034) 1 100100001 (0x121) 2 001100001 3 101100000 4 000110001 5 100110000 6 001110000 7 000100101 8 100100100 9 001100100 (0x064) L ensemble des codes pourrait donc être déclaré de la manière suivante : int tablesymboles[44]= 0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124, 0x064, 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00d, 0x10c, 0x04c, 0x01c, 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007, 0x106, 0x046, 0x016, 0x181, 0x0c1, 0x1c0, 0x091, 0x190, 0x0d0, 0x085, 0x184, 0x0c4, 0x094, 0x0a8, 0x0a2, 0x08a, 0x02a }; Exemple : 5 100110000 donnera la séquence suivante : barre (noir) large - espace (blanc) étroit - barre étroite - espace large - barre large - espace étroit - barre étroite - espace étroit - barre étroite Les 9 bits du code binaire se lisent de la gauche vers la droite : Les bits pairs correspondent aux barres noires et les impairs aux barres blanches Un bit égal à 1 correspond à une barre épaisse et si 0 ce sera une barre fine TP Qt : Code-barre 8 / 12 2012 tv <tvaira@free.fr>

Le dessin 2D Il y a deux approches pour dessiner en 2D dans Qt : un modèle fonctionnel basé sur QPainter un modèle objet basé sur le framework Graphics View La classe QPainter est la classe de base de dessin bas niveau sur les widgets et les autres dispositifs de dessins : QPainter fournit des fonctions hautement optimisées : il peut tout dessiner des lignes simples à des formes complexes. QPainter peut fonctionner sur n importe quel objet qui hérite de la classe QPaintDevice. Remarque : L utilisation courante de QPainter est à l intérieur de la méthode paintevent() d un widget : construire, personnaliser (par exemple le pinceau), dessiner et détruire l objet QPainter après le dessin. Un widget est "repeint" : Lorsque une fenêtre passe au dessus Lorsque l on déplace le composant... Lorsque l on le lui demande explicitement : repaint() entraîne un rafraichissement immédiat ou update() met une demande de rafraîchissement en file d attente Important : Dans tous les cas, c est la méthode paintevent qui est appelée : void paintevent(qpaintevent* e) ; Pour dessiner dans un widget, il faut donc redéfinir QWidget : :paintevent(). La classe QPainter fournit de nombreuses méthodes : setpen() : lignes et contours (cf. QPen) setbrush() : remplissage (cf. QBrush) setfont() : texte (cf. QFont) Lignes et contours : drawrect(), drawpoint(), drawline(),... Remplissage : fillrect(),... Divers : drawtext(), drawpixmap(), drawimage(), drawpicture() Exemple simple pour dessiner : class MyWidget : public QWidget public: MyWidget( QWidget *parent = 0 ) : QWidget( parent ) } void paintevent(qpaintevent* e) QWidget::paintEvent(e); // effectue le comportement standard QPainter painter(this); // construire TP Qt : Code-barre 9 / 12 2012 tv <tvaira@free.fr>

QPen pen(qcolor(qt::black), 1); // personnaliser QBrush brush(qcolor(qt::black)); QRect barrefine = QRect(0, 0, 4, 100); // position x et y (en pixels) QRect barreepaisse = QRect(0, 0, 8, 100); painter.setbrush(brush); painter.setpen(pen); painter.drawrect(barrefine); // dessiner une barre (fine) }; } // detruire Pour imprimer, il suffit de "dessiner" sur un objet de type QPrinter : class MyWidget : public QWidget public: MyWidget( QWidget *parent = 0 ) : QWidget( parent ) } void paintevent(qpaintevent* e) QWidget::paintEvent(e); // effectue le comportement standard QPrinter printer; QPainter painter(&printer); // construire QString texte = "5"; QPen pen(qcolor(qt::black), 1); // personnaliser QBrush brush(qcolor(qt::black)); QFont font("verdana", 12); QRect barrefine = QRect(0, 0, 4, 100); // position x et y (en pixels) QRect barreepaisse = QRect(0, 0, 8, 100); QRect Texte = QRect(0, 105, 100, 60); painter.setbrush(brush); painter.setpen(pen); painter.setfont(font); painter.drawrect(barrefine); // dessiner une barre (fine) //... painter.drawtext(texte, Qt::AlignCenter, "*" + texte + "*"); }; } // detruire TP Qt : Code-barre 10 / 12 2012 tv <tvaira@free.fr>

Qt fournit une boîte de dialogue QPrintDialog prête à l emploi pour choisir l imprimante et valider l impression. Sa mise en oeuvre est assez simple à réaliser : QPrinter printer; QPrintDialog *dialog = new QPrintDialog(&printer, this); dialog->setwindowtitle(tr("imprimer")); if (dialog->exec() == QDialog::Accepted) //qdebug() << "c est parti!"; //... } Mise en oeuvre du code-barre Il vous faut maintenant créer une classe GenerateurCodeBarre qui prend en charge le dessin du code-barre et son impression. #ifndef GenerateurCodeBarre_H #define GenerateurCodeBarre_H #include <QtGui> class GenerateurCodeBarre : public QWidget public: GenerateurCodeBarre(QWidget *parent = 0); ~GenerateurCodeBarre(); void paintevent(qpaintevent* e); void imprimer(qstring codebarre); void dessiner(qstring codebarre); private: //... }; #endif // GenerateurCodeBarre_H Code 9 generateurcodebarre.h Question 5. Coder la classe GenerateurCodeBarre. Question 6. Coder les méthodes generer() et imprimer() de la classe MyDialog. TP Qt : Code-barre 11 / 12 2012 tv <tvaira@free.fr>

TP Qt : Code-barre 12 / 12 2012 tv <tvaira@free.fr>