Vous êtes sur la page 1sur 9

Crer une fentre avec barre de menus dans Eric / QtDesigner

La plupart des applications possde une barre de menu (Fichier, Edition, etc.) dans la partie suprieure de la fentre principale (MainWindow). Juste en dessous de cette barre, on peut ajouter une barre contenant des icnes de raccourcis vers les rubriques les plus utilises des menus (Ouvrir une fichier, Enregistrer, Imprimer, etc.). Il arrive aussi parfois que l'on ne veuille que la barre de tche sans barre de menus. QtDesigner, dans la version 3 de Qt, permet de crer, ds le dpart, une fentre principale avec ces barres de menu et de tches. Si vous choisissez au dmarrage New MainWindow

Un Wizard vous permet de choisir les lments que vous voulez voir apparatre sur votre fentre :

Vous avez le choix de placer une barre de menus et/ou une barre de tches ou rien du tout. Si vous choisissez de placer l'une ou l'autre ou les deux, il vous reste l'option de crer les Slots et les Connexions entre les actions du menu et les mthodes correspondantes. Si vous dcochez Create Slots and Connections ... vous tes bon pour entrer les lignes de code vous mme. C'est donc plus facile de laisser ces options coches. Dans notre exemple, nous avons tout laiss. Le dialogue suivant nous demande de choisir parmi les rubriques prdfinies de la barre de tches :

Il suffit de transfrer dans le champ de droite, au moyen des flches, les lments que l'on veut voir apparatre sur la fentre. Le slecteur nomm Category situ dans la partie suprieure permet de passer d'un menu l'autre : File, Edit, etc. On peut galement placer de sparateurs <Separator> qui apparatront comme des lignes verticales pour sparer les icnes dans la barre. Les noms des rubriques sont, pour le moment, en anglais, mais ne vous tracassez pas, vous aurez le loisir de les entrer en franais plus tard. Le dialogue suivant vous permet de configurer votre barre de menus :

Pour Qt, chaque rubrique d'un menu est un objet de classe QAction. Vous voyez donc dj apparatre dans ce dialogue le nom de chacun des objets qui sera cr si vous le conservez. Slectionnez une action et utilisez le ciseau pour l'enlever de votre futur menu. Chacun des objets restant se verra reli un Slot : l'objet fileNewAction, par exemple, sera reli au Slot fileNew. Puisqu'on a coch Create Slots... dans le Wizard, des dfinitions vides de ces Slots sont places automatiquement dans le fichier annexe .ui.h dans la syntaxe C++ :

Rappel : l'diteur interne de QtDesigner est accessible partir du Project Overview

Une fois la slection faite, enregistrez votre travail dans un rpertoire de votre choix. Dans notre exemple, nous sauvons dans un rpertoire MaFenetre cr cet effet. Nous crons un rpertoire tout neuf, car nous avons l'intention d'y regrouper notre futur projet avec Eric. Comme nous n'avons pas donn de nom particulier notre fentre, QtDesigner lui a attribu le nom gnrique Form1. Le fichier sauv aura donc pour nom gnrique form1.ui et le fichier annexe contenant les dfinitions vides des Slots aura pour nom form1.ui.h Nous obtenons le rsultat suivant :

Les menus sont dj accessibles dans ce mode dition. Vous pouvez galement lancer un Preview pour avoir une impression plus juste du rsultat final. Dans ce mode dition, des indications en bleu sont des lments qui n'apparatront pas dans la version finale. Nous allons passer maintenant au choses srieuses : la transformation en code de notre fentre Form1, son sous-classage et le codage des Slots, tout cela avec Eric. Ouvrons Eric Crons un nouveau Projet :

Ici je l'appelle MaFenetre, mais vous mettez ce que vous voulez bien sr ! Slectionnez le rpertoire o vous avez enregistr le fichier form1.ui de QtDesigner Eric demande si vous voulez ajouter un fichier au Projet :

Yes, bien sr ! Nous voulons ajouter le fichier form1.ui Ceci fait, le fichier form1.ui apparat dans le Navigateur de Projet dans la rubrique compas :

Pour pouvoir ajouter des fonctionnalits, nous devons la sous-classer : crer une sous-classe de Form1 que nous allons appeler MaFenetre (original, non ?) :
4

Pour cela, rappelez-vous, on clique droit sur le fichier form1.ui et on slectionne Generate Subclass :

Il cre ainsi directement un fichier Python/Qt sans nom qui dfinit la sous-classe MaFenetre de Form1 avec des dfinitions vides des Slots :

Voici son contenu complet :


# -*- coding: utf-8 -*from qt import * from form1 import Form1 class MaFenetre(Form1): def __init__(self,parent = None,name = None,fl = 0): Form1.__init__(self,parent,name,fl) # public slot def fileNew(self): print "MaFenetre.fileNew(): Not implemented yet"

# public slot def fileOpen(self): print "MaFenetre.fileOpen(): Not implemented yet" # public slot def fileSave(self): print "MaFenetre.fileSave(): Not implemented yet" # public slot def fileSaveAs(self): print "MaFenetre.fileSaveAs(): Not implemented yet" # public slot def filePrint(self): print "MaFenetre.filePrint(): Not implemented yet" # public slot def fileExit(self): print "MaFenetre.fileExit(): Not implemented yet" # public slot def editUndo(self): print "MaFenetre.editUndo(): Not implemented yet" # public slot def editRedo(self): print "MaFenetre.editRedo(): Not implemented yet" # public slot def editCut(self): print "MaFenetre.editCut(): Not implemented yet" # public slot def editCopy(self): print "MaFenetre.editCopy(): Not implemented yet" # public slot def editPaste(self): print "MaFenetre.editPaste(): Not implemented yet" # public slot def editFind(self): print "MaFenetre.editFind(): Not implemented yet" # public slot

def helpIndex(self): print "MaFenetre.helpIndex(): Not implemented yet" # public slot def helpContents(self): print "MaFenetre.helpContents(): Not implemented yet" # public slot def helpAbout(self): print "MaFenetre.helpAbout(): Not implemented yet"

Pour le moment, les Slots affichent un message disant que la fonction n'est pas encore implmente. C'est cet endroit qu'il faudra entrer le code correspondant l'action de chaque lment des menus. Sauvons le fichier sous le nom : mafenetre.py Quelques remarques utiles : Si vous voulez que ce fichier fasse partie du Projet, vous devez aller l'onglet Serpent du Navigateur de Projet, cliquer droit, slectionner Add File dans le menu contextuel et slectionner le fichier mafenetre.py dans le gestionnaire de fichier. De manire gnrale, tous les fichiers (.ui, .py ou autres) qui apparaissent dans les fentres du Navigateur de Projet font partie du Projet en cours. Vous tes libre d'en ajouter ou d 'en retirer (en cliquant doit dessus et en slectionnant Remove from Projet dans le menu contextuel). Cela n'a aucune consquence sur la construction de votre application, de toute manire les fichiers se trouvent toujours dans le rpertoire que vous avez choisi. L'avantage de mettre des fichiers dans le Navigateur de Projet, c'est qu'ils sont chargs dans Eric (et visibles dans le Navigateur de Projet) chaque fois que vous ouvrez ce Projet. Vous n'avez donc qu'une seule opration effectuer : Open Project pour avoir tout sur la main. Dans notre cas, ouvrir le projet consiste charger le fichier MaFenetre.e3p qui se trouve dans le rpertoire o vous avez sauv tout le reste. N'oubliez pas d'enregistrer de temps en temps le Projet (menu Projet Save), de toute manire, Eric vous le rappellera au moment o vous voulez le fermer. On l'ajoute dans le Navigateur de Projet, comme dcrit plus haut. Note : Il se peut que le menu contextuel n'apparaisse pas quand vous cliquez droit dans une des fentres du Navigateur de Projet. C'est un bug de certaines versions d'Eric. Pour y remdier, allez dans le menu Projet et Ouvrez-le de nouveau (Project -> Open) en le slectionnant dans le gestionnaire de fichier. Bizarre ! Il est temps de gnrer le code de Form1 qui contient les caractristiques de notre fentre. Pour cela, refaites apparatre le fichier form1.ui en cliquant sur l'onglet compas . Cliquez droit dessus et slectionnez Compile form Un fichier form1.py est apparu dans la fentre de Source du Navigateur de Projet (Serpent) :

En cliquant 2x sur un de ces fichiers sources, on fait apparatre leur contenu dans l'diteur. Si vous regardez le code de form1.py, vous constatez qu'il contient : - un codage particulier des icnes de la barre d'outils (image bitmap) - toutes les dfinitions des objets de classe QAction des menus - les dfinitions des connexions entre ces objets et les Slots, par exemple :
self.connect(self.fileOpenAction,SIGNAL("activated()"),self.fileOpen)

- des dfinitions vides de ces Slots (l aussi !?) Le dernier point n'est pas tonnant, puisqu'on a demand QtDesigner de le faire. Le compilateur pyuic inclus dans Eric a tout simplement inclus le fichier form1.ui.h contenant les dfinitions vides des Slots (en C++) dans sa traduction de form1.ui en syntaxe Python. Pour pouvoir continuer, nous allons devoir nous dbarrasser de ces dfinitions vides. Il ne suffit pas de les enlever du fichier form1.py. En effet, lorsque nous ajouterons des lments sur notre fentre avec QtDesigner et que nous demanderons Eric de recompiler la Form1, pyuic va de nouveau remettre ces dfinitions vides, court-circuitant les dfinitions que nous aurions introduit dans le fichier mafenetre.py La meilleure procdure est la suivante : - Copiez les dfinitions des connexions dans le fichier form1.py - Collez ces dfinitions dans le corps de la fonction __init__ de la classe MaFenetre du fichier mafenetre.py :

- Supprimez toutes les dfinitions vides des slots dans le fichier form1.py - Enregistrez tout - Retournez dans QtDesigner et supprimez toutes les dfinitions vides se trouvant dans le fichier form1.ui.h dans l'diteur interne. Cela va dtruire le fichier form1.ui.h inutile, mais aussi supprimer les dfinitions des connexions lors des prochaines regnration de form1.py avec pyuic (c'est pour cela que vous ai demand de copier coller ces dfinitions dans le fichier mafenetre.py, pour viter de devoir les r-crire la main).

- Sauvez le fichier form1.ui dans QtDesigner Et voil ! Maintenant nous avons 3 fichiers bien clairs : - form1.ui qui ne contient plus que la structure de la fentre - form1.py qui est la traduction en Python de form1.ui - mafenetre.py qui contient la sous-classe de Form1 dans laquelle se trouvent les dfinitions des connexions, les dfinitions de slots que l'on introduira la main. Nous pouvons maintenant : - modifier notre fentre dans QtDesigner comme bon nous semble - sauver nos modifications (toujours dans le fichier form1.ui bien sr !) - passez Eric pour recompiler form1.ui, ce qui actualise le fichier form1.py auquel on ne touche plus - modifier le fichier mafenetre.py en y ajouter du code Il ne reste plus qu' crer le fichier main.py qui sera charg de lancer l'application :
#!/usr/bin/env python import sys from qt import * from mafenetre import * if __name__ == "__main__": a = QApplication(sys.argv) QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()")) w = MaFenetre() a.setMainWidget(w) w.show() a.exec_loop()

- Ajouter ce fichier au projet - Eventuellement l'ajouter comme Mainscript du menu Projet -> Properties Il ne reste plus qu' entrer le code...