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 !