Qt Jambi : JViewer, un lecteur d'image

On va ici créer une visionneuse d'images avec des menus.

35 commentaires Donner une note à l'article (5)

Article lu   fois.

Les deux auteurs

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. 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 devrez d'utiliser QLabel pour votre widget central. Pour charger les images, QPixmap.

II. La solution

Voici ma proposition :

 
Sélectionnez
/*
 * JViewer.java
 * Version : 2 
 *
 * Created on 2 novembre 2007
 * Modified on 13 novembre 2007
 */
 

/* Importation des espaces de nom nécessaires */
import com.trolltech.qt.core.*;
 
import com.trolltech.qt.gui.*;
import com.trolltech.qt.core.Qt.*;
import com.trolltech.qt.gui.QSizePolicy.Policy;
 
/* Définition de l'application et de ses attributs */
public class JViewer extends QMainWindow {
    private String curFile;         // Fichier actuellement ouvert
    private QPixmap pixImage;
    private QLabel widgetImage;     // Conteneur de l'image
    private QMenu fileMenu;         // Menu Fichier
    private QMenu helpMenu;         // Menu Aide
    private QToolBar fileToolBar;   // Barre d'outil Fichier
    private QAction openAct;        // Action Ouvrir
    private QAction sizeToFitAct;        // Action Ouvrir
    private QAction exitAct;        // Action Quitter
    private QAction aboutAct;       // Action A Propos de JEditor
    private QAction aboutQtAct;     // Action A propos de Qt Jambi
    private String rsrcPath = "classpath:images"; // Répertoire des images
    
    /* Définition du constructeur */
    public JViewer()
    {
        setSizePolicy(Policy.Expanding, Policy.Expanding);
        setMinimumSize(240, 160);
 
        QMenuBar menuBar = new QMenuBar();                // On crée la barre de menu
        pixImage = new QPixmap(rsrcPath+"/JViewer.png");
        widgetImage = new QLabel(this);
        widgetImage.setSizePolicy(Policy.Expanding, Policy.Expanding);
        widgetImage.setAlignment(AlignmentFlag.AlignCenter);
        widgetImage.setPixmap(pixImage);
        resize();
 
        setMenuBar(menuBar);                              // On ajoute la barre de menu à notre Application
        setCentralWidget(widgetImage);                    // On ajoute la zone de Texte
        /* On lance les méthodes de création des différents attributs de notre fenêtre */
        try {
              createActions();
 
          } catch (Exception e) {
              e.printStackTrace();
          }
          createMenus();
          createToolBars();
          createStatusBar();
 
          /* Le fichier de départ est un fichier vide */
          setCurrentFile("");
      }
      
      /* Méthode d'ouverture du fichier */
      public void open()
      {
        String fileName = QFileDialog.getOpenFileName(this);
        if (fileName.length() != 0)
          loadFile(fileName);
      }
 
      public void sizeToFit(){
        widgetImage.setPixmap(pixImage.scaled(widgetImage.size(),
                                  AspectRatioMode.KeepAspectRatio, 
                                  TransformationMode.SmoothTransformation));
      }
      
      /* Fonction A propos de JEditor */
      public void about()
      {
          QMessageBox.about(this,
                            tr("A Propos de JViewer"),
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;tr("<b>JViewer<b>&#160;est&#160;une&#160;petite&#160;application&#160;"+
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;"réalisé&#160;par&#160;<a&#160;href='http://www.trunat.fr/'>Natim</a>.&#160;Pour&#160;découvrir&#160;QT&#160;Jambi."));
&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;/*&#160;Création&#160;des&#160;actions&#160;des&#160;menus&#160;et&#160;des&#160;toolbars&#160;*/
&#160;&#160;&#160;&#160;&#160;&#160;private&#160;void&#160;createActions()
&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/*&#160;Actions&#160;du&#160;menu&#160;Fichier&#160;*/
&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;openAct&#160;=&#160;new&#160;QAction(new&#160;QIcon(rsrcPath&#160;+&#160;"/open.png"),&#160;tr("&Ouvrir..."),&#160;this);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;openAct.setShortcut(tr("Ctrl+O"));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;openAct.setStatusTip(tr("Ouvrir&#160;un&#160;fichier"));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;openAct.triggered.connect(this,&#160;"open()");
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sizeToFitAct&#160;=&#160;new&#160;QAction(new&#160;QIcon(rsrcPath&#160;+&#160;"/sizeToFit.tif"),&#160;tr("Afficher&#160;l'image&#160;dans&#160;sa&#160;taille&#160;d'origine"),&#160;this);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sizeToFitAct.setShortcut(tr("Ctrl+A"));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sizeToFitAct.setStatusTip(tr("Taille&#160;d'origine"));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sizeToFitAct.triggered.connect(this,&#160;"resize()");
&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;exitAct&#160;=&#160;new&#160;QAction(new&#160;QIcon(rsrcPath&#160;+&#160;"/exit.png"),&#160;tr("Quitter"),&#160;this);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;exitAct.setStatusTip(tr("Quitter&#160;l'application"));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;exitAct.triggered.connect(QApplication.instance(),&#160;"quit()");
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/*&#160;Action&#160;du&#160;menu&#160;Aide&#160;*/
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;aboutAct&#160;=&#160;new&#160;QAction(new&#160;QIcon(rsrcPath&#160;+&#160;"/about.png"),&#160;tr("A&#160;Propos&#160;de&#160;&JViewer"),&#160;this);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;aboutAct.setStatusTip(tr("A&#160;Propos&#160;de&#160;JEditor"));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;aboutAct.triggered.connect(this,&#160;"about()");
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;aboutQtAct&#160;=&#160;new&#160;QAction(new&#160;QIcon(rsrcPath&#160;+&#160;"/qt-logo.png"),&#160;tr("A&#160;Propos&#160;de&#160;&Qt"),&#160;this);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;aboutQtAct.setStatusTip(tr("Show&#160;the&#160;Qt&#160;library's&#160;About&#160;box"));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;aboutQtAct.triggered.connect(QApplication.instance(),&#160;"aboutQt()");
&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;/*&#160;Création&#160;des&#160;Menus&#160;*/
&#160;&#160;&#160;&#160;&#160;&#160;private&#160;void&#160;createMenus()
&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/*&#160;Menu&#160;fichier&#160;*/
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;fileMenu&#160;=&#160;menuBar().addMenu(tr("&Fichier"));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;fileMenu.addAction(openAct);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;fileMenu.addAction(sizeToFitAct);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;fileMenu.addSeparator();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;fileMenu.addAction(exitAct);
&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/*&#160;Menu&#160;Aide&#160;*/
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;helpMenu&#160;=&#160;menuBar().addMenu(tr("&Aide"));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;helpMenu.addAction(aboutAct);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;helpMenu.addAction(aboutQtAct);
&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;/*&#160;Création&#160;de&#160;la&#160;barre&#160;de&#160;menu&#160;*/
&#160;&#160;&#160;&#160;&#160;&#160;private&#160;void&#160;createToolBars()
&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;fileToolBar&#160;=&#160;addToolBar(tr("Fichier"));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;fileToolBar.addAction(openAct);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;fileToolBar.addAction(sizeToFitAct);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;fileToolBar.addSeparator();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;fileToolBar.addAction(exitAct);
&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;/*&#160;Création&#160;de&#160;la&#160;Barre&#160;de&#160;Status&#160;*/
&#160;&#160;&#160;&#160;&#160;&#160;private&#160;void&#160;createStatusBar()
&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;statusBar().showMessage(tr("Prêt"));
&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;/*&#160;Charger&#160;un&#160;fichier&#160;*/
&#160;&#160;&#160;&#160;&#160;&#160;public&#160;void&#160;loadFile(String&#160;fileName)
&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pixImage&#160;=&#160;new&#160;QPixmap(fileName);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(pixImage&#160;==&#160;null){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;QMessageBox.warning(this,&#160;tr("JViewer"),&#160;String.format(tr("Erreur&#160;à&#160;l'ouverture&#160;de&#160;l'image&#160;%1$s:\n%2$s."),&#160;fileName));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;widgetImage.clear();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;widgetImage.setPixmap(pixImage);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;resize();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;setCurrentFile(fileName);
&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;statusBar().showMessage(tr("Image&#160;Chargée"),&#160;2000);
&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;/*&#160;On&#160;enregistre&#160;le&#160;nom&#160;du&#160;fichier&#160;ouvert&#160;comme&#160;nom&#160;du&#160;fichier&#160;courant&#160;*/
&#160;&#160;&#160;&#160;&#160;&#160;public&#160;void&#160;setCurrentFile(String&#160;fileName)
&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;curFile&#160;=&#160;fileName;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;setWindowModified(false);
&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String&#160;shownName;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if&#160;(curFile.length()&#160;==&#160;0)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;shownName&#160;=&#160;tr("Aucun&#160;fichier");
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;shownName&#160;=&#160;curFile;
&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;setWindowTitle(String.format(tr("%1$s[*]&#160;-&#160;%2$s"),&#160;shownName,&#160;tr("JViewer")));
&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;protected&#160;void&#160;paintEvent(QPaintEvent&#160;e)&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sizeToFit();
&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;protected&#160;void&#160;resize(){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(pixImage.size().subtract(new&#160;QSize(240,160)).isValid()){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;super.resize(pixImage.size().add(size().subtract(widgetImage.size())));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}else{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;super.resize(new&#160;QSize(240,160));
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;widgetImage.setPixmap(pixImage);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;/*&#160;Lancement&#160;de&#160;l'application&#160;*/
&#160;&#160;&#160;&#160;&#160;&#160;public&#160;static&#160;void&#160;main(String[]&#160;args)&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;QApplication.initialize(args);
&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;JViewer&#160;application&#160;=&#160;new&#160;JViewer();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;application.show();
&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;QApplication.exec();
&#160;&#160;&#160;&#160;&#160;&#160;}
}

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 !

Les sources sont disponibles.

III. Remerciements

Merci à Thibaut Cuvelier pour la mise en page et à Jacques Thery pour la relecture !

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Qt en Java avec Qt Jambi
Du Qt en Java avec Qt Jambi
Utiliser Qt avec Java
Codons notre première fenêtre
Disposer les choses
Une boîte de dialogue
Une application avec des menus et des barres d'outils
Connecter les objets entre eux
Émettre un signal
JEditor, un simple éditeur de fichier texte
JViewer, un lecteur d'image
Image non disponible