TP : JViewer, un lecteur d'image

Avatar de Monsieur X
Description du chapitre et des ses objectifs :

Dans ce chapitre, nous allons réaliser une application de lecture d'images.

Image de Partie

Accéder directement à une des parties du cours :

Cahier des charges

Une image vaut plus qu'un long discours ...

Image utilisateur


Ici on ne voit pas la barre de menu, mais c'est le même principe que le TP précédent.
La difficulté réside dans la gestion des images.

Vous aurez besoin d'utiliser QLabel pour votre widget central.
Pour charger les images QPixmap.

Bon courage.

La solution

Voici ma proposition :

Code java - Numéro de ligne
  1. /*
  2.  * JViewer.java
  3.  * Version : 2
  4.  *
  5.  * Created on 2 novembre 2007
  6.  * Modified on 13 novembre 2007
  7.  */
  8.  
  9. /* Importation des espaces de nom nécessaires */
  10. import com.trolltech.qt.core.*;
  11.  
  12. import com.trolltech.qt.gui.*;
  13. import com.trolltech.qt.core.Qt.*;
  14. import com.trolltech.qt.gui.QSizePolicy.Policy;
  15.  
  16. /* Définition de l'application et de ses attributs */
  17. public class JViewer extends QMainWindow {
  18.     private String curFile;         // Fichier actuellement ouvert
  19.     private QPixmap pixImage;
  20.     private QLabel widgetImage;     // Conteneur de l'image
  21.     private QMenu fileMenu;         // Menu Fichier
  22.     private QMenu helpMenu;         // Menu Aide
  23.     private QToolBar fileToolBar;   // Barre d'outil Fichier
  24.     private QAction openAct;        // Action Ouvrir
  25.     private QAction sizeToFitAct;        // Action Ouvrir
  26.     private QAction exitAct;        // Action Quitter
  27.     private QAction aboutAct;       // Action A Propos de JEditor
  28.     private QAction aboutQtAct;     // Action A propos de Qt Jambi
  29.     private String rsrcPath = "classpath:images"; // Répertoire des images
  30.    
  31.     /* Définition du constructeur */
  32.     public JViewer()
  33.     {
  34.         setSizePolicy(Policy.Expanding, Policy.Expanding);
  35.         setMinimumSize(240, 160);
  36.  
  37.         QMenuBar menuBar = new QMenuBar();                // On crée la barre de menu
  38.         pixImage = new QPixmap(rsrcPath+"/JViewer.png");
  39.         widgetImage = new QLabel(this);
  40.         widgetImage.setSizePolicy(Policy.Expanding, Policy.Expanding);
  41.         widgetImage.setAlignment(AlignmentFlag.AlignCenter);
  42.         widgetImage.setPixmap(pixImage);
  43.         resize();
  44.  
  45.         setMenuBar(menuBar);                              // On ajoute la barre de menu à notre Application
  46.         setCentralWidget(widgetImage);                    // On ajoute la zone de Texte
  47.         /* On lance les méthodes de création des différents attributs de notre fenêtre */
  48.         try {
  49.               createActions();
  50.  
  51.           } catch (Exception e) {
  52.               e.printStackTrace();
  53.           }
  54.           createMenus();
  55.           createToolBars();
  56.           createStatusBar();
  57.  
  58.           /* Le fichier de départ est un fichier vide */
  59.           setCurrentFile("");
  60.       }
  61.      
  62.       /* Méthode d'ouverture du fichier */
  63.       public void open()
  64.       {
  65.         String fileName = QFileDialog.getOpenFileName(this);
  66.         if (fileName.length() != 0)
  67.           loadFile(fileName);
  68.       }
  69.  
  70.       public void sizeToFit(){
  71.         widgetImage.setPixmap(pixImage.scaled(widgetImage.size(),
  72.                                   AspectRatioMode.KeepAspectRatio,
  73.                                   TransformationMode.SmoothTransformation));
  74.       }
  75.      
  76.       /* Fonction A propos de JEditor */
  77.       public void about()
  78.       {
  79.           QMessageBox.about(this,
  80.                             tr("A Propos de JViewer"),
  81.                             tr("<b>JViewer<b> est une petite application "+
  82.                               "réalisé par <a href='http://www.trunat.fr/'>Natim</a>. Pour découvrir QT Jambi."));
  83.       }
  84.      
  85.       /* Création des actions des menus et des toolbars */
  86.       private void createActions()
  87.       {
  88.           /* Actions du menu Fichier */
  89.  
  90.           openAct = new QAction(new QIcon(rsrcPath + "/open.png"), tr("&amp;Ouvrir..."), this);
  91.           openAct.setShortcut(tr("Ctrl+O"));
  92.           openAct.setStatusTip(tr("Ouvrir un fichier"));
  93.           openAct.triggered.connect(this, "open()");
  94.          
  95.           sizeToFitAct = new QAction(new QIcon(rsrcPath + "/sizeToFit.tif"), tr("Afficher l'image dans sa taille d'origine"), this);
  96.           sizeToFitAct.setShortcut(tr("Ctrl+A"));
  97.           sizeToFitAct.setStatusTip(tr("Taille d'origine"));
  98.           sizeToFitAct.triggered.connect(this, "resize()");
  99.  
  100.           exitAct = new QAction(new QIcon(rsrcPath + "/exit.png"), tr("Quitter"), this);
  101.           exitAct.setStatusTip(tr("Quitter l'application"));
  102.           exitAct.triggered.connect(QApplication.instance(), "quit()");
  103.          
  104.           /* Action du menu Aide */
  105.           aboutAct = new QAction(new QIcon(rsrcPath + "/about.png"), tr("A Propos de &amp;JViewer"), this);
  106.           aboutAct.setStatusTip(tr("A Propos de JEditor"));
  107.           aboutAct.triggered.connect(this, "about()");
  108.           aboutQtAct = new QAction(new QIcon(rsrcPath + "/qt-logo.png"), tr("A Propos de &amp;Qt"), this);
  109.           aboutQtAct.setStatusTip(tr("Show the Qt library's About box"));
  110.           aboutQtAct.triggered.connect(QApplication.instance(), "aboutQt()");
  111.       }
  112.      
  113.       /* Création des Menus */
  114.       private void createMenus()
  115.       {
  116.           /* Menu fichier */
  117.           fileMenu = menuBar().addMenu(tr("&amp;Fichier"));
  118.           fileMenu.addAction(openAct);
  119.           fileMenu.addAction(sizeToFitAct);
  120.           fileMenu.addSeparator();
  121.           fileMenu.addAction(exitAct);
  122.  
  123.           /* Menu Aide */
  124.           helpMenu = menuBar().addMenu(tr("&amp;Aide"));
  125.           helpMenu.addAction(aboutAct);
  126.           helpMenu.addAction(aboutQtAct);
  127.       }
  128.      
  129.       /* Création de la barre de menu */
  130.       private void createToolBars()
  131.       {
  132.           fileToolBar = addToolBar(tr("Fichier"));
  133.           fileToolBar.addAction(openAct);
  134.           fileToolBar.addAction(sizeToFitAct);
  135.           fileToolBar.addSeparator();
  136.           fileToolBar.addAction(exitAct);
  137.       }
  138.      
  139.       /* Création de la Barre de Status */
  140.       private void createStatusBar()
  141.       {
  142.           statusBar().showMessage(tr("Pr&amp;#144;et"));
  143.       }
  144.            
  145.       /* Charger un fichier */
  146.       public void loadFile(String fileName)
  147.       {
  148.           pixImage = new QPixmap(fileName);
  149.           if(pixImage == null){
  150.             QMessageBox.warning(this, tr("JViewer"), String.format(tr("Erreur à l'ouverture de l'image %1$s:\n%2$s."), fileName));
  151.             return;
  152.           }
  153.           widgetImage.clear();
  154.           widgetImage.setPixmap(pixImage);
  155.           resize();
  156.           setCurrentFile(fileName);
  157.  
  158.           statusBar().showMessage(tr("Image Chargée"), 2000);
  159.       }
  160.      
  161.       /* On enregistre le nom du fichier ouvert comme nom du fichier courant */
  162.       public void setCurrentFile(String fileName)
  163.       {
  164.           curFile = fileName;
  165.           setWindowModified(false);
  166.  
  167.           String shownName;
  168.           if (curFile.length() == 0)
  169.               shownName = tr("Aucun fichier");
  170.           else
  171.               shownName = curFile;
  172.  
  173.           setWindowTitle(String.format(tr("%1$s[*] - %2$s"), shownName, tr("JViewer")));
  174.       }
  175.      
  176.       protected void paintEvent(QPaintEvent e) {
  177.         sizeToFit();
  178.       }
  179.      
  180.       protected void resize(){
  181.         if(pixImage.size().subtract(new QSize(240,160)).isValid()){
  182.           super.resize(pixImage.size().add(size().subtract(widgetImage.size())));
  183.         }else{
  184.           super.resize(new QSize(240,160));
  185.           widgetImage.setPixmap(pixImage);
  186.         }
  187.       }
  188.      
  189.       /* Lancement de l'application */
  190.       public static void main(String[] args) {
  191.             QApplication.initialize(args);
  192.  
  193.             JViewer application = new JViewer();
  194.             application.show();
  195.  
  196.             QApplication.exec();
  197.       }
  198. }


Si vous en avez une différente, vous pouvez la poster en commentaire de ce tutoriel, on pourra comparer les fonctionnalités et si elle est mieux que la mienne, elle pourra la remplacer comme solution.


En conclusion, je dirai simplement que vous avez toutes les clefs en mains pour réussir, alors à vous de jouer.
Pour voir l'application finie, allez ici.

Chapitre précédent - Sommaire

Nos rédacteurs et membres sont pour la plupart ouverts à des remarques constructives et servir à alerter le rédacteur du cours, des fautes éventuelles ou de propositions et nouvelles perspectives de cours etc ...
Pour ce faire cliquez ici

Postez vous aussi un commentaire à cette partie via le lien que voici