IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

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

Profil Pro

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(240160);
 
        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"),
                            tr("<b>JViewer<b> est une petite application "+
                              "réalisé par <a href='http://www.trunat.fr/'>Natim</a>. Pour découvrir QT Jambi."));
      }
      
      /* Création des actions des menus et des toolbars */
      private void createActions()
      {
          /* Actions du menu Fichier */
 
          openAct = new QAction(new QIcon(rsrcPath + "/open.png"), tr("&Ouvrir..."), this);
          openAct.setShortcut(tr("Ctrl+O"));
          openAct.setStatusTip(tr("Ouvrir un fichier"));
          openAct.triggered.connect(this"open()");
          
          sizeToFitAct = new QAction(new QIcon(rsrcPath + "/sizeToFit.tif"), tr("Afficher l'image dans sa taille d'origine"), this);
          sizeToFitAct.setShortcut(tr("Ctrl+A"));
          sizeToFitAct.setStatusTip(tr("Taille d'origine"));
          sizeToFitAct.triggered.connect(this"resize()");
 
          exitAct = new QAction(new QIcon(rsrcPath + "/exit.png"), tr("Quitter"), this);
          exitAct.setStatusTip(tr("Quitter l'application"));
          exitAct.triggered.connect(QApplication.instance(), "quit()");
          
          /* Action du menu Aide */
          aboutAct = new QAction(new QIcon(rsrcPath + "/about.png"), tr("A Propos de &JViewer"), this);
          aboutAct.setStatusTip(tr("A Propos de JEditor"));
          aboutAct.triggered.connect(this"about()");
          aboutQtAct = new QAction(new QIcon(rsrcPath + "/qt-logo.png"), tr("A Propos de &Qt"), this);
          aboutQtAct.setStatusTip(tr("Show the Qt library's About box"));
          aboutQtAct.triggered.connect(QApplication.instance(), "aboutQt()");
      }
      
      /* Création des Menus */
      private void createMenus()
      {
          /* Menu fichier */
          fileMenu = menuBar().addMenu(tr("&Fichier"));
          fileMenu.addAction(openAct);
          fileMenu.addAction(sizeToFitAct);
          fileMenu.addSeparator();
          fileMenu.addAction(exitAct);
 
          /* Menu Aide */
          helpMenu = menuBar().addMenu(tr("&Aide"));
          helpMenu.addAction(aboutAct);
          helpMenu.addAction(aboutQtAct);
      }
      
      /* Création de la barre de menu */
      private void createToolBars()
      {
          fileToolBar = addToolBar(tr("Fichier"));
          fileToolBar.addAction(openAct);
          fileToolBar.addAction(sizeToFitAct);
          fileToolBar.addSeparator();
          fileToolBar.addAction(exitAct);
      }
      
      /* Création de la Barre de Status */
      private void createStatusBar()
      {
          statusBar().showMessage(tr("Prêt"));
      }
            
      /* Charger un fichier */
      public void loadFile(String fileName)
      {
          pixImage = new QPixmap(fileName);
          if(pixImage == null){
            QMessageBox.warning(thistr("JViewer"), String.format(tr("Erreur à l'ouverture de l'image %1$s:\n%2$s."), fileName));
            return;
          }
          widgetImage.clear();
          widgetImage.setPixmap(pixImage);
          resize();
          setCurrentFile(fileName);
 
          statusBar().showMessage(tr("Image Chargée"), 2000);
      }
      
      /* On enregistre le nom du fichier ouvert comme nom du fichier courant */
      public void setCurrentFile(String fileName)
      {
          curFile = fileName;
          setWindowModified(false);
 
          String shownName;
          if (curFile.length(== 0)
              shownName = tr("Aucun fichier");
          else
              shownName = curFile;
 
          setWindowTitle(String.format(tr("%1$s[*] - %2$s"), shownName, tr("JViewer")));
      }
      
      protected void paintEvent(QPaintEvent e) {
        sizeToFit();
      }
      
      protected void resize(){
        if(pixImage.size().subtract(new QSize(240,160)).isValid()){
          super.resize(pixImage.size().add(size().subtract(widgetImage.size())));
        }else{
          super.resize(new QSize(240,160));
          widgetImage.setPixmap(pixImage);
        }
      }
      
      /* Lancement de l'application */
      public static void main(String[] args) {
            QApplication.initialize(args);
 
            JViewer application = new JViewer();
            application.show();
 
            QApplication.exec();
      }
}

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+   

Image non disponible