I. Cahier des charges▲
Une image vaut plus qu'un long discours...

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 :
/*
* 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"),
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(this, tr("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 !
III. Remerciements▲
Merci à Thibaut Cuvelier pour la mise en page et à Jacques Thery pour la relecture !



