Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Programmation > Bibliothèques > Qt > Du Qt en Java avec Qt Jambi > Les objets d'une fenêtre > TP : JEditor, un simple éditeur de fichier texte > Lecture du tutoriel

TP : JEditor, un simple éditeur de fichier texte

Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Avatar
Auteur : Natim
Visualisations : 1 781

Plus d'informations Plus d'informations
Pour commencer à nous familiariser avec Qt, je vous propose de réaliser un simple éditeur de texte.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Cahier des charges

Ce lecteur possédera 3 menus :

On pourra donc créer, ouvrir, enregistrer et enregistrer sous un fichier texte.
En plus d'avoir ces menus dans la barre de menu, on ajoutera une toolbar contenant les plus utiles.

La solution

Pour avoir une barre de menu, il nous faudra hériter de la classe QMainWindow de Qt.
En effet, avec Qt, lorsque l'on veut créer un widget, on hérite de la classe en Qt et ensuite on ajoute des méthodes d'actions spécifiques.
Par exemple les méthodes new(), open(), save(), saveas(), quit().

N'oubliez pas la documentation de Qt Jambi.
C'est votre source de renseignement par excellence. Dedans, il y a absolument tout.

Vous pouvez aussi la trouver dans votre installation de Qt Jambi en local.

Vous le savez peut-être, Qt Jambi, nous propose un outil très intéressant que l'on appelle QtDesigner.
Malgrès les apparences, cet outil est difficile à prendre en main.
En le lançant, on s'aperçoit très vite que l'on peut faire des choses très jolies.
Mais c'est un faux semblant car ensuite, vous n'arriverez pas à l'exploiter correctement dans vos programmes.

Pour bien comprendre la manière dont les choses se présentent, on ne va pas utiliser QtDesigner dans un premier temps.
Voici le code commenté de l'application :
Vous pouvez télécharger le pack d'image.

Code : Java
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
/*
 * JEditor.java
 * Version : 2 
 *
 * Created on 2 novembre 2007
 * Modified on 13 novembre 2007
 */
 
/* Import des classes espace de nomage nécessaires */
import com.trolltech.qt.QVariant;
 
/* Importation des éléments du GUI */
import com.trolltech.qt.gui.QApplication;
import com.trolltech.qt.gui.QMainWindow;
import com.trolltech.qt.gui.QTextEdit;
import com.trolltech.qt.gui.QMenu;
import com.trolltech.qt.gui.QToolBar;
import com.trolltech.qt.gui.QAction;
import com.trolltech.qt.gui.QMenuBar;
import com.trolltech.qt.gui.QFileDialog;
import com.trolltech.qt.gui.QCloseEvent;
import com.trolltech.qt.gui.QMessageBox;
import com.trolltech.qt.gui.QIcon;
import com.trolltech.qt.gui.QKeySequence;
import com.trolltech.qt.gui.QCursor;
 
/* Importation des éléments de gestions */
import com.trolltech.qt.core.QFile;
import com.trolltech.qt.core.QTextStream;
import com.trolltech.qt.core.Qt;
 
 
/* Définition de l'application et de ses attributs */
public class JEditor extends QMainWindow {
    private String curFile;         // Fichier actuellement ouvert
    private QTextEdit textEdit;     // Widget permettant l'affichage et la modification du texte
    private QMenu fileMenu;         // Menu Fichier
    private QMenu editMenu;         // Menu Edition
    private QMenu helpMenu;         // Menu Aide
    private QToolBar fileToolBar;   // Barre d'outil Fichier
    private QToolBar editToolBar;   // Barre d'outil Edition
    private QAction newAct;         // Action Nouveau
    private QAction openAct;        // Action Ouvrir
    private QAction saveAct;        // Action Enregistrer
    private QAction saveAsAct;      // Action Enregistrer Sous
    private QAction exitAct;        // Action Quitter
    private QAction cutAct;         // Action Couper
    private QAction copyAct;        // Action Copier
    private QAction pasteAct;       // Action Coller
    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 JEditor()
    {
        QMenuBar menuBar = new QMenuBar();                // On crée la barre de menu
        textEdit = new QTextEdit(this);
        setMenuBar(menuBar);                              // On ajoute la barre de menu à notre Application
        setCentralWidget(textEdit);                       // 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();
          /* On lance la méthode documentWasModified lorsque le contenu du texte est modifié */
          textEdit.document().contentsChanged.connect(this, "documentWasModified()");
          /* Le fichier de départ est un fichier vide */
          setCurrentFile("");
      }
      
      /* On redéfinit la méthode lorsque l'on clique sur le bouton fermer de la fenêtre pour demander à l'utilisateur
         s'il veut enregistrer avant de quitter */
      public void closeEvent(QCloseEvent event)
      {
          if (maybeSave()) {
              event.accept();
          } else {
              event.ignore();
          }
      }
      
      /* Lors de l'ouverture d'un nouveau fichier, on doit fermer le précédent, on avertit donc l'utilisateur.
         On efface le contenu du widget textEdit et on met à 0 la valeur du nom de fichier */
      public void newFile()
      {
          if (maybeSave()) {
              textEdit.clear();
              setCurrentFile("");
          }
      }
      
      /* Méthode d'ouverture du fichier */
      public void open()
      {
          if (maybeSave()) {
              String fileName = QFileDialog.getOpenFileName(this);
              if (fileName.length() != 0)
                  loadFile(fileName);
          }
      }
      
      /* On enregistre les modifications effectuées dans le fichier */
      public boolean save()
      {
          if (curFile.length() == 0) {
              return saveAs();
          } else {
              return saveFile(curFile);
          }
      }
      
      /* On enregistre les modifications dans un nouveau fichier */
      public boolean saveAs()
      {
          String fileName = QFileDialog.getSaveFileName(this);
          if (fileName.length() == 0)
              return false;
 
          return saveFile(fileName);
      }
      
      /* Fonction A propos de JEditor */
      public void about()
      {
          QMessageBox.about(this,
                            tr("A Propos de JEditor"),
                            tr("<b>JEditor<b> est une application d'exemple"+
                              "pour faire une démonstration de l'utilisation de Qt Jambi"));
      }
      
      /* Méthode qui définit que le document a été modifié pour savoir si on a besoin de le sauvegarder ou pas */
      public void documentWasModified()
      {
          setWindowModified(textEdit.document().isModified());
      }
      
      /* Création des actions des menus et des toolbars */
      private void createActions()
      {
          /* Actions du menu Fichier */
          newAct = new QAction(new QIcon(rsrcPath + "/new.png"), tr("&Nouveau"), this);
          newAct.setShortcut(new QKeySequence(tr("Ctrl+N")));
          newAct.setStatusTip(tr("Nouveau fichier"));
          newAct.triggered.connect(this, "newFile()");
 
          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()");
 
          saveAct = new QAction(new QIcon(rsrcPath + "/save.png"), tr("&Enregistrer..."), this);
          saveAct.setShortcut(tr("Ctrl+S"));
          saveAct.setStatusTip(tr("Enregistrer le fichier"));
          saveAct.triggered.connect(this, "save()");
 
          saveAsAct = new QAction(new QIcon(rsrcPath + "/save_as.png"), tr("Enregistrer Sous..."), this);
          saveAsAct.setStatusTip(tr("Enregistrer le fichier sous ..."));
          saveAsAct.triggered.connect(this, "saveAs()");
 
          exitAct = new QAction(tr("Quitter"), this);
          exitAct.setStatusTip(tr("Quitter l'application"));
          exitAct.triggered.connect(QApplication.instance(), "quit()");
 
          /* Actions du Menu Edition */
          cutAct = new QAction(new QIcon(rsrcPath + "/cut.png"), tr("Cou&per"), this);
          cutAct.setShortcut(new QKeySequence(tr("Ctrl+X")));
          cutAct.setStatusTip(tr("Couper la séléction"));
          cutAct.triggered.connect(textEdit, "cut()");
 
          copyAct = new QAction(new QIcon(rsrcPath + "/copy.png"), tr("&Copier..."), this);
          copyAct.setShortcut(tr("Ctrl+C"));
          copyAct.setStatusTip(tr("Copier la séléction"));
          copyAct.triggered.connect(textEdit, "copy()");
 
          pasteAct = new QAction(new QIcon(rsrcPath + "/paste.png"), tr("Co&ller..."), this);
          pasteAct.setShortcut(tr("Ctrl+V"));
          pasteAct.setStatusTip(tr("Coller le texte précédement couper ou copier"));
          pasteAct.triggered.connect(textEdit, "paste()");
          
          /* Action du menu Aide */
          aboutAct = new QAction(new QIcon(rsrcPath + "/about.png"), tr("A Propos de &JEditor"), this);
          aboutAct.setStatusTip(tr("A Propos de JEditor"));
          aboutAct.triggered.connect(this, "about()");
          
          aboutQtAct = new QAction(new QIcon(rsrcPath + "/qt.png"), tr("A Propos de &Qt"), this);
          aboutQtAct.setStatusTip(tr("Show the Qt library's About box"));
          aboutQtAct.triggered.connect(QApplication.instance(), "aboutQt()");
          
          cutAct.setEnabled(false);
          copyAct.setEnabled(false);
          textEdit.copyAvailable.connect(cutAct, "setEnabled(boolean)");
          textEdit.copyAvailable.connect(copyAct, "setEnabled(boolean)");
      }
      
      /* Création des Menus */
      private void createMenus()
      {
          /* Menu fichier */
          fileMenu = menuBar().addMenu(tr("&Fichier"));
          fileMenu.addAction(newAct);
          fileMenu.addAction(openAct);
          fileMenu.addAction(saveAct);
          fileMenu.addAction(saveAsAct);
          fileMenu.addSeparator();
          fileMenu.addAction(exitAct);
 
          /* Menu Edition */
          editMenu = menuBar().addMenu(tr("&Edition"));
          editMenu.addAction(cutAct);
          editMenu.addAction(copyAct);
          editMenu.addAction(pasteAct);
 
          menuBar().addSeparator();
 
          /* 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(newAct);
          fileToolBar.addAction(openAct);
          fileToolBar.addAction(saveAct);
 
          editToolBar = addToolBar(tr("Edition"));
          editToolBar.addAction(cutAct);
          editToolBar.addAction(copyAct);
          editToolBar.addAction(pasteAct);
      }
      
      /* Création de la Barre de Status */
      private void createStatusBar()
      {
          statusBar().showMessage(tr("Prêt"));
      }
      
      /* Test si le fichier doit être sauvegarder ou non */
      private boolean maybeSave()
      {
          if (textEdit.document().isModified()) {
              QMessageBox.StandardButton ret = QMessageBox.warning(this, tr("JEditor"),
                                                                    tr("Le document a été modifié.\n" +
                                                                      "Voulez-vous sauvegarder les modifications ?"),
                                                                    new QMessageBox.StandardButtons(QMessageBox.StandardButton.Ok,
                                                                                                    QMessageBox.StandardButton.Discard,
                                                                                                    QMessageBox.StandardButton.Cancel));
              if (ret == QMessageBox.StandardButton.Ok) {
                  return save();
              } else if (ret == QMessageBox.StandardButton.Cancel) {
                  return false;
              }
          }
          return true;
      }
      
      /* Charger un fichier */
      public void loadFile(String fileName)
      {
          QFile file = new QFile(fileName);
          if (!file.open(new QFile.OpenMode(QFile.OpenModeFlag.ReadOnly, QFile.OpenModeFlag.Text))) {
              QMessageBox.warning(this, tr("JEditor"), String.format(tr("Impossible de lire le fichier %1$s:\n%2$s."), fileName, file.errorString()));
              return;
          }
 
          QTextStream in = new QTextStream(file);
          QApplication.setOverrideCursor(new QCursor(Qt.CursorShape.WaitCursor));
          textEdit.setPlainText(in.readAll());
          QApplication.restoreOverrideCursor();
 
          setCurrentFile(fileName);
          statusBar().showMessage(tr("Fichier Chargé"), 2000);
      }
      
      /* Sauvegarde du fichier */
      public boolean saveFile(String fileName)
      {
          QFile file = new QFile(fileName);
          if (!file.open(new QFile.OpenMode(QFile.OpenModeFlag.WriteOnly, QFile.OpenModeFlag.Text))) {
              QMessageBox.warning(this, tr("JEditor"), String.format(tr("Impossible d'écrire dans le fichier %1$s:\n%2$s."), fileName, file.errorString()));
              return false;
          }
 
          QTextStream out = new QTextStream(file);
          QApplication.setOverrideCursor(new QCursor(Qt.CursorShape.WaitCursor));
          out.writeString(textEdit.toPlainText());
          QApplication.restoreOverrideCursor();
 
          setCurrentFile(fileName);
          statusBar().showMessage(tr("Fichier sauvegardé"), 2000);
          file.close();
          return true;
      }
      
      /* On enregistre le nom du fichier ouvert comme nom du fichier courant */
      public void setCurrentFile(String fileName)
      {
          curFile = fileName;
          textEdit.document().setModified(false);
          setWindowModified(false);
 
          String shownName;
          if (curFile.length() == 0)
              shownName = tr("sans_titre.txt");
          else
              shownName = curFile;
 
          setWindowTitle(String.format(tr("%1$s[*] - %2$s"), shownName, tr("JEditor")));
      }
      
      /* Lancement de l'application */
      public static void main(String[] args) {
            QApplication.initialize(args);
 
            JEditor application = new JEditor();
            application.show();
 
            QApplication.exec();
        }
}


Voilà le programme commenté.
Je pense que le programmeur chevronné que vous êtes comprendra assez facilement cet exemple.
On peut très facilement ajouter une fonction CTRL+Z.
C'est un petit exemple mais il vous montre déjà pas mal de petites choses.
L'étape suivante serait de pouvoir ouvrir plusieurs fichiers en même temps. (Petite piste : Les threads et l'implémentation de Clonable)
Vous pouvez noter aussi le déplacement géré par Qt des barres de menus, l'agrandissement de la fenêtre aussi.

Voilà, vous avez créé votre première application multi plates-formes en Java avec Qt Jambi.
Vous pouvez avoir différents rendus en utilisant cette commande :

Code : Console
java JEditor -style=motif
java JEditor -style=plastique
java JEditor -style=windows
java JEditor -style=cde


Pour voir l'application finie, allez ici.
Chapitre précédent Sommaire Chapitre suivant
Retour en haut Retour en haut


Créé : le 13/10/2007 à 04:20:33
Modifié : le 08/11/2008 à 20:41:36
Avancement : 100%
Licence : Creative Commons BY-SA

L'orthographe, la grammaire et la présentation de ce tutoriel ont été vérifiées par les zCorrecteurs.
3 commentaires

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 101 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0453s (0.0325s)