Boîtes de dialogue usuelles



Documents pareils
Modifier les propriétés d'un widget

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

L'architecture MVC avec les widgets complexes

Modéliser ses fenêtres avec Qt Designer

Comment Utiliser les Versions, les Modification, les Comparaisons, Dans les Documents

1. Introduction Création d'une requête...2

Installation et paramétrage. Accès aux modèles, autotextes et clip- art partagés

Navigation dans Windows

Création d'un questionnaire (sondage)

Publication Assistée par Ordinateur

CRÉER DES LEÇONS AVEC L'ÉDITEUR DU LOGICIEL 1000 MOTS POUR APPRENDRE À LIRE EN FRANÇAIS, ANGLAIS ET ALLEMAND

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Warren PAULUS Robin GODEFROID. C++ - Interface Graphique avec Visual Studio 2010

les Formulaires / Sous-Formulaires Présentation Créer un formulaire à partir d une table...3

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

Assistance à distance sous Windows

Stellar Phoenix Outlook PST Repair - Technical 5.0 Guide d'installation

Débuter avec OOo Base

Initiation à la programmation en Python

INFORM :: DEMARRAGE RAPIDE A service by KIS

Premiers pas sur e-lyco

1. Création d'un état Création d'un état Instantané Colonnes Création d'un état Instantané Tableau... 4

Créer une base de données

Comment sauvegarder ses documents

Comment Définir une Plage de données Pour Utiliser Fonctions de Filtres et de Tris

CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE

Module SMS pour Microsoft Outlook MD et Outlook MD Express. Guide d'aide. Guide d'aide du module SMS de Rogers Page 1 sur 40 Tous droits réservés

Didacticiel de mise à jour Web

Licence de Biologie, 1ère année. Aide. [Aide 1] Comment utiliser l'explorateur Windows? Comment créer des dossiers?

Ateliers Python+Qt : Premiers pas : S'installer pour PyQt... en quelques minutes sous Windows!

Application de lecture de carte SESAM-Vitale Jeebop

Guide de démarrage rapide Centre de copies et d'impression Bureau en Gros en ligne

@telier d'initiation

Manuel d'utilisation

Septembre 2012 Document rédigé avec epsilonwriter

Comment bien démarrer avec. NetAirClub GUIDE ADMINISTRATEUR V1.5. Table des matières

Utiliser Freemind à l'école

MEDIAplus elearning. version 6.6

Chapitre 4 Pierre, papier, ciseaux

PHPWEBSITE -Tutoriel image

CREER UN PETIT SITE WEB EN COMPOSANT DES PAGES HTML

Guide pour la réalisation d'un document avec Open Office Writer 2.2

Automatisation d'une Facture 4. Liste Déroulante Remises Case à cocher Calculs

Le service de création de site Internet : Mode d emploi. La Création de Site Internet

Guide de démarrage Janvier 2012

Compte-rendu de projet de Système de gestion de base de données

v7.1 SP2 Guide des Nouveautés

BADPLUS V5 MANUEL D'UTILISATION. Imports de données joueurs à partir de la base fédérale en ligne Poona. Stéphan KIEFFER - Dominique BOSSERT

Qlik Sense Cloud. Qlik Sense Copyright QlikTech International AB. Tous droits réservés.

Table des matières. 1 À propos de ce manuel Icônes utilisées dans ce manuel Public visé Commentaires...

AGASC / BUREAU INFORMATION JEUNESSE Saint Laurent du Var Tel : bij@agasc.fr Word: Les tableaux.

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Le langage C. Séance n 4

Manuel d'utilisation de l'administration du site Japo.ch - 1

HelpAndManual_unregistered_evaluation_copy GESTIONNAIRE D'ALARMES CENTRALISE OPTIM'ALARM. Manuel d'utilisation

Guide d'utilisation du Serveur USB

pcon.planner 6 Préparer et présenter une implantation en toute simplicité

FAIRE SES COMPTES AVEC GRISBI

Gestion d Active Directory à distance : MMC & Délégation


LECON 2 : PROPRIETES DE L'AFFICHAGE Version aout 2011

F O R M A T I O N S LOTUS NOTES. 8.5 Utilisateurs rue de la Bôle. E U R L. a u c a p i t a l d e

2010 Ing. Punzenberger COPA-DATA GmbH. Tous droits réservés.

Trier les ventes (sales order) avec Vtiger CRM

Modem LG LDU-1900D. Guide d utilisateur. LG Electronics

Tutoriel d'utilisation du logiciel Thunderbird version 2.0

Manuel de l'utilisateur d'intego VirusBarrier Express et VirusBarrier Plus

1. Utilisation du logiciel Keepass

ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A.

Traitement de texte : Quelques rappels de quelques notions de base

M-Budget Mobile Internet. M-Budget Mobile Connection Manager pour Mac OS

Louer et utiliser un Hébergement Mutualisé OVH (Version 1.0)

Répertorier vos mots de passe avec Passbox : 1) Télécharger le fichier d'installation :

Trajet d'une recette payée par un tiers (2)

Ateliers Python+Qt : Premiers pas : Comment développez ses propres interfaces graphiques sur le RaspberryPi?

Tutorial et Guide TeamViewer

I. Introduction aux fonctions : les fonctions standards

Découverte et prise en main de SWEET HOME 3D

Pluridisciplinarité. Classe de BTS DATR

Votre site Internet avec FrontPage Express en 1 heure chrono

PCTV Systems TVCenter

Chapitre 2. Classes et objets

Qu est ce qu une bibliothèque?

Dans la série LES TUTORIELS LIBRES présentés par le site FRAMASOFT. Premiers pas avec WinPT (cryptographie sous Win) EITIC

NIGHT VISION STUDIOS GUIDE DU LOGICIEL. Produit Voyance. Version 1.5

Introduction : Cadkey

GESTION DES BONS DE COMMANDE

Créer un diaporama avec Open Office. Sommaire

Rendre un plan de cours interactif avec Médiator

Tutoriel. Votre site web en 30 minutes

Guide d'installation sous Windows

Exercice interactif : hotpotatoes.

TAGREROUT Seyf Allah TMRIM

TABLEAU CROISE DYNAMIQUE

Sage Start Saisie des collaborateurs Instructions. A partir de la version

Importer un fichier CSV

Transcription:

Après un chapitre sur les signaux et les slots riche en nouveaux concepts, on relâche ici un peu la pression. Nous allons découvrir les boîtes de dialogue usuelles, aussi appelées "common dialogs" par nos amis anglophones. Qu'est-ce qu'une boîte de dialogue usuelle? C'est une fenêtre qui sert à remplir une fonction bien précise. Par exemple, on connaît la boîte de dialogue "message" qui affiche un message et ne vous laisse d'autre choix que de cliquer sur le bouton OK. Ou encore la boîte de dialogue "ouvrir un fichier", "enregistrer un fichier", "sélectionner une couleur", etc. On ne s'amuse pas à recréer "à la main" ces fenêtres à chaque fois. On profite de fonctions système pour ouvrir des boîtes de dialogue pré-construites. PyQt s'adapte à l'os pour afficher une boîte de dialogue qui corresponde aux formes habituelles de votre OS. En clair : attendez-vous à un chapitre simple qui vous donnera de nombreux outils pour pouvoir interagir avec l'utilisateur de votre programme! Boîtes de dialogue usuelles Afficher un message Saisir une information Sélectionner une police Sélectionner une couleur Sélection d'un fichier ou d'un dossier

1 Afficher un message Nous allons créer un bouton sur notre fenêtre, un clic sur le bouton doit ouvrir la boîte de dialogue. Les boîtes de dialogue "afficher un message" sont contrôlées par la classe QMessageBox. from PySide.QtGui import QMessageBox

1.1 Quelques rappels et préparatifs Pour que l'on soit sûr de travailler ensemble sur le même code, je vous donne le code source du fichier MaFenetre.py. Il a été simplifié au maximum. #! /usr/bin/python #-*-coding: utf-8 -*- from PySide.QtGui import QInputDialog, QLineEdit, QPushButton, QProgressBar, QSlider, QWidget, QApplication, QFont, QMessageBox from PySide.QtCore import QObject, SIGNAL, SLOT, Qt, QCoreApplication,QLocale, QTranslator, QString, QLibraryInfo import os,sys class MaFenetre(QWidget): def init (self): QWidget. init (self) self.setfixedsize(300,120) self.boutondialogue = QPushButton(self.trUtf8("Ouvrir la boîte de dialogue"), self) self.boutondialogue.move(40, 50) self.connect(self.boutondialogue, SIGNAL("clicked()"), self.ouvrirdialogue) def ouvrirdialogue(self): # Vous insérerez le code d'ouverture des boîtes de dialogue ici pass if name ==" main ": a=qapplication(args) # Création d'un widget qui servira de fenêtre fenetre=mafenetre() fenetre.show() r=a.exec_() C'est très simple. Nous avons créé un bouton dans la boîte de dialogue qui appelle le slot personnalisé ouvrirdialogue(). C'est dans ce slot que nous nous chargerons d'ouvrir une boîte de dialogue.

1.2 Ouvrir une boîte de dialogue avec une méthode statique La classe QMessageBox permet de créer des objets de type QMessageBox. En voici quelques méthodes : Une méthode statique dans une classe est une méthode qui n'a pas besoin d'une instance de cette classe pour être appelée. Par exemple la méthode information de la classe QmessageBox ci-dessous est invoquée par l'instruction QmessageBox.information(...). Une méthode qui n'est pas statique doit être invoquée par une instance de la classe. Par exemple : l=['a','b','c'] l.append('d') #OK, l est une instance de list list.append('w') #interdit, list n'est pas une instance de list QmessageBox.information(...) #OK, information et une methode statique de QmessageBox 1.2.1 QMessageBox::information La méthode statique information() permet d'ouvrir une boîte de dialogue constituée d'une icône "information". Son prototype C++ est le suivant : StandardButton information ( QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultbutton = NoButton ); Seuls les 3 premiers paramètres sont obligatoires, les autres ayant comme vous le voyez une valeur par défaut. parent : un pointeur vers la fenêtre parente (qui doit être de type QWidget ou hériter de QWidget). Vous pouvez envoyer NULL en paramètre si vous ne voulez pas que votre boîte de dialogue ait une fenêtre parente, mais ce sera plutôt rare. title : le titre de la boîte de dialogue (affiché en haut de la fenêtre). text : le texte affiché au sein de la boîte de dialogue.

Testons donc un code très simple. Voici le code du slot ouvrirdialogue() : def ouvrirdialogue(self): QMessageBox.information(self, self.trutf8("titre de la fenêtre"), self.trutf8("bonjour et bienvenue à tous les Zéros!")) Le résultat est une boîte de dialogue comme vous avez l'habitude d'en voir, constituée d'un bouton OK : Vous noterez que lorsque la boîte de dialogue est ouverte, on ne peut plus accéder à sa fenêtre parente qui est derrière. On dit que la boîte de dialogue est une fenêtre modale : c'est une fenêtre qui "bloque" temporairement son parent en attente d'une réponse de l'utilisateur. A l'inverse, on dit qu'une fenêtre est non modale quand on peut toujours accéder à la fenêtre derrière. C'est le cas en général des boîtes de dialogue "Rechercher un texte" dans les éditeurs de texte. Comble du raffinement, il est même possible de mettre en forme son message à l'aide de balises (X)HTML pour ceux qui connaissent. Exemple de boîte de dialogue "enrichie" avec du code HTML : QMessageBox.information(self, self.trutf8("titre de la fenêtre"), self.trutf8("bonjour et bienvenue <br> à tous les <strong>zéros</strong>!"))

1.2.2 QMessageBox::warning Si la boîte de dialogue "information" sert à informer l'utilisateur par un message, la boîte de dialogue warning le met en garde contre quelque chose. Elle est généralement accompagné d'un "ding" caractéristique. Elle s'utilise de la même manière que QMessageBox::information, mais cette fois l'icône change : QMessageBox.warning(self, self.trutf8("titre de la fenêtre"), self.trutf8("attention, vous êtes peut-être un Zéro!"));

1.2.3 QMessageBox::critical Quand c'est trop tard et qu'une erreur s'est produite, il ne vous reste plus qu'à utiliser la méthode critical() : ici, je teste deux versions, l'une avec gestion du codage Utf8, l'autre sans. QMessageBox.critical(self, self.trutf8("titre de la fenêtre"), self.trutf8("vous n'êtes pas un Zéro, sortez ou j'appelle la police!")) QMessageBox.critical(self, "Titre de la fenêtre", "Vous n'êtes pas un Zéro, sortez ou j'appelle la police!")

1.2.4 QMessageBox::question Si vous avez une question à poser à l'utilisateur, c'est la boîte de dialogue qu'il vous faut. QmessageBox.question(self, self.trutf8("titre de la fenêtre"), self.trutf8("dites voir, je me posais la question comme ça, êtes-vous vraiment un Zéro?")) Comment peut-on répondre à la question avec un simple bouton OK? Par défaut, c'est toujours un bouton OK qui s'affiche. Mais dans certains cas, comme lorsqu'on pose une question, il faudra afficher d'autres boutons pour que la boîte de dialogue ait du sens. 1.2.5 Personnaliser les boutons de la boîte de dialogue, les "flags" Pour personnaliser les boutons de la boîte de dialogue, il faut utiliser le 4ème paramètre de la méthode. Ce paramètre accepte une combinaison de valeurs prédéfinies, séparées par un OR (la barre verticale ). On appelle cela des flags. Pour ceux qui se poseraient la question, le 5ème et dernier paramètre de la fonction permet d'indiquer quel est le bouton par défaut. On change rarement cette valeur car Qt choisit généralement le bouton qui convient le mieux par défaut. La liste des flags disponibles est donnée par la documentation. Vous avez du choix comme vous pouvez le voir. Si on veut placer les boutons "Oui" et "Non", il nous suffit de combiner les valeurs "QMessageBox::Yes" et "QMessageBox::No"

QMessageBox.question(self, self.trutf8("titre de la fenêtre"), self.trutf8("dites voir, je me posais la question,êtes-vous vraiment un Zéro?"), QMessageBox.Yes QMessageBox.No) Les boutons apparaissent alors : Les boutons sont écrits en anglais, que faire?

1.3 Les applications PyQt peuvent être facilement traduites. Sans entrer dans les détails du fonctionnement de la traduction, je vous donne un code à placer dans le programme principal : #! /usr/bin/python #-*-coding: utf-8 -*- from PyQt4.QtGui import * from mafenetre_5_0 import * import sys if name ==" main ": a=qapplication(sys.argv) locale = QLocale.system().name() translator=qtranslator () translator.load(qstring("qt_") + locale, QLibraryInfo.location(QLibraryInfo.TranslationsPath)) a.installtranslator(translator) # Création d'un widget qui servira de fenêtre fenetre=mafenetre() fenetre.show() r=a.exec_() return r Les lignes ajoutées ont été surlignées. Normalement, votre application devrait maintenant afficher des boutons en français :

1.4 Récupérer la valeur de retour de la boîte de dialogue Les méthodes que nous venons de voir retournent un entier (int). On peut tester facilement la signification de ce nombre à l'aide des valeurs prédéfinies par Qt. def ouvrirdialogue(self): reponse =QmessageBox.question(self, self.trutf8("interrogatoire"), self.trutf8("dites voir,je me posais la question comme ça, <br>êtes-vous vraiment un Zéro?"), QMessageBox.Yes QMessageBox.No) if (reponse == QMessageBox.Yes): QMessageBox.information(self,"Interrogatoire", self.trutf8("courage, Capitaine, nous y sommes presque!")) elif (reponse == QMessageBox.No): QMessageBox.critical(self, "Interrogatoire", self.trutf8("sapajou! Coloquinte! Tchouk-tchouk-Nougat! <br>ingrat! Lâche! Traître!<br>Sors d'ici ou j'appelle Tintin!"))

2 Saisir une information Les boîtes de dialogues précédentes étaient un peu limitées car, à part présenter différents boutons, on ne pouvait pas trop interagir avec l'utilisateur. Si vous souhaitez que votre utilisateur saisisse une information, ou encore fasse un choix parmi une liste, les boîtes de dialogue de saisie sont idéales. Elles sont gérées par la classe QInputDialog, que je vous conseille d'inclure dès maintenant dans MaFenetre.py. Les boîtes de dialogue "saisir une information" peuvent être de 4 types. Nous allons les voir dans l'ordre : Chacune de ces fonctionnalités est assurée par une méthode statique différente.

2.1 Saisir un texte (QInputDialog.getText) La méthode gettext() ouvre une boîte de dialogue qui permet à l'utilisateur de saisir un texte. Son prototype C++ est : QString QInputDialog::getText ( QWidget * parent, const QString & title, const QString & label, QLineEdit::EchoMode mode = QLineEdit::Normal, const QString & text = QString(), bool * ok = 0, Qt::WindowFlags f = 0 ); L'équivalent Python, extrait de la doc PyQt : /usr/share/doc/pyqt4/qinputdialog.html#gettext (QString, bool ok) QInputDialog.getText (QWidget parent, QString title, QString label, QLineEdit.EchoMode echo = QLineEdit.Normal, QString text = QString(), Qt.WindowFlags f = 0) Vous pouvez tout d'abord constater que la méthode retourne un tuple (QString, bool ok) constitué d'un QString, et d'un booléen. Un Qstring est une chaîne de caractères de Qt. Les paramètres signifient, dans l'ordre : parent : la fenêtre parente. Peut être mis à None pour ne pas indiquer de fenêtre parente. title : titre de la fenêtre affiché en haut. label : texte affiché dans la fenêtre. mode : mode d'édition du texte. Permet de dire si on veut que les lettres s'affichent quand on tape, ou si elles doivent être remplacées par des astérisques (pour les mots de passe) ou si aucune lettre ne doit s'afficher. Toutes les options sont dans la doc. Par défaut, les lettres s'affichent normalement (QLineEdit::Normal). text : le texte par défaut dans la zone de saisie. ok : un pointeur vers un booléen pour que Qt puisse vous dire si l'utilisateur a cliqué sur OK ou sur Annuler. f = quelques flags (options) permettant d'indiquer si la fenêtre est modale (bloquante) ou pas. Les valeurs possibles sont détaillées par la doc.

Heureusement, comme vous pouvez le constater en lisant le prototype, certains paramètres possèdent des valeurs par défaut ce qui fait qu'ils ne sont pas obligatoires. Reprenons notre code de tout à l'heure et cette fois, au lieu d'afficher une QMessageBox, nous allons afficher une QInputDialog lorsqu'on clique sur le bouton de la fenêtre. pseudo, ok =QInputDialog.getText(self, self.trutf8("pseudo"), self.trutf8("quel est votre pseudo?"), QLineEdit.Normal, Qstring()) Ici, la méthode QinputDialog.getText modifie et renvoit deux valeurs : le texte entré (pseudo) et un booléen (ok) qui indique quel bouton (Ok ou annuler) a été cliqué par l'utilisateur. En C++, une méthode ne peut renvoyer qu'une seule valeur. Les programmeurs de Qt ont choisi de renvoyer le texte entré par l'utilisateur, tandis que la valeur ok du bouton cliqué est passée en paramètre par adresse (bool * ok = 0). En python, les deux valeurs sont créées et modifiées par la méthode, puis renvoyées dans le tuple (pseudo,ok) La boîte de dialogue devrait ressembler à cela : On peut aller plus loin et vérifier si le bouton OK a été actionné, et si c'est le cas on peut alors afficher le pseudo de l'utilisateur dans une QMessageBox. A noter : les boîtes de dialogue ne semblent pas totalement traduites (cancel au lieu de annuler)

def ouvrirdialogue(self): pseudo,ok=qinputdialog.gettext(self, self.trutf8("pseudo"), self.trutf8("quel est votre pseudo?"), QlineEdit.Normal, QString()) if (ok and not pseudo.isempty()): msg=self.trutf8("bonjour " + str(pseudo) + ", ça va?") QMessageBox.information(self, self.trutf8("pseudo"), msg) else : msg=self.trutf8 ("Mon p'tit gars, va falloir me donner ton pseudo, et vite!" QmessageBox.critical(self,"Pseudo",msg)) Ici, on récupère dans ok la valeur du booléen qui reçoit l'information "Le bouton OK a-t-il été cliqué?". Je peux ensuite faire un test, d'où la présence de mon if. Je vérifie 2 choses : Si le bouton OK a été cliqué Et si le texte n'est pas vide (la méthode isempty de QString) Si un pseudo a été entré et que l'utilisateur a cliqué sur OK, alors une boîte de dialogue lui souhaite la bienvenue. Sinon, une erreur est affichée. Ce schéma présente ce qui peut se produire : Exercice : essayez d'afficher le pseudo de l'utilisateur sur le bouton ok.

2.2 Saisir un nombre entier, un nombre décimal, un élément de liste Toutes ces saisies sont de nature analogue à la saisie de texte. Les prototypes sont décrits ci-dessous. Pour les paramètres, voir la documentation. Si vous avez installé la doc python-qt4, elle est probablement dans : /usr/share/doc/python-qt4-doc/html/qinputdialog.html La classe MaFenetre ouvre ces quatre dialogues de saisie. La saisie d'un double (getdouble) est pratiquement identique à celle d'un entier (getinteger), à la différence près qu'il y a un paramètre qui permet d'indiquer le nombre maximal de chiffres après la virgule autorisés (paramètre décimals). La saisie de texte (gettext) a été vue ci-dessus La saisie d'un élément de liste avec un menu déroulant (getitem), est légèrement plus délicat puisqu'il faut construire une QstringList (la liste des valeurs possibles). C'est ce que réalise l'instruction QstringList(['a','b','c','d']). On peut aussi citer append() qui permet d'ajouter un élément à la fin de la liste.

Voici les prototypes C++ de ces méthodes : (int, bool ok) QInputDialog.getInteger (QWidget parent, QString title, QString label, int value = 0, int minvalue = -2147483647, int maxvalue = 2147483647, int step = 1, Qt.WindowFlags f = 0) (QString, bool ok) QInputDialog.getItem (QWidget parent, QString title, QString label, QStringList list, int current = 0, bool editable = True, Qt.WindowFlags f = 0) (QString, bool ok) QInputDialog.getText (QWidget parent, QString title, QString label, QLineEdit.EchoMode echo = QlineEdit.Normal, QString text = QString(), Qt.WindowFlags f = 0) (float, bool ok) QInputDialog.getDouble (QWidget parent, QString title, QString label, float value = 0, float minvalue = -2147483647, float maxvalue = 2147483647, int decimals = 1, Qt.WindowFlags f = 0)

Voici un exemple d'utilisation : #! /usr/bin/python #-*-coding: utf-8 -*- from PyQt4.QtGui import * from PyQt4.QtCore import * import os,sys class MaFenetre(QWidget): def init (self): QWidget. init (self) self.setfixedsize(230,120) texte,ok = QInputDialog.getText(self, self.trutf8("texte"),self.trutf8("entrez un texte")); entier,ok = QInputDialog.getInteger(self, self.trutf8("entier"), self.trutf8("entrez un nombre entier"),3,0,1000,2); decimal,ok = QInputDialog.getDouble(self, self.trutf8("décimal"),self.trutf8("entrez un nombre décimal")); item,ok = QInputDialog.getItem(self, self.trutf8("liste"), self.trutf8("choisissez dans la liste"), map(self.trutf8,["aneto","palas","valluna","faïal"])); msg="- "+texte+"<br>- "+str(entier)+"<br>- "+str(decimal)+"<br>- "+ item ok=qmessagebox.information(self, self.trutf8("vos données : "), msg) Et les boites de dialogue correspondantes Et la boite d'information fournie à la fin du programme

3 Sélectionner une police La boîte de dialogue "Sélectionner une police" est une des boîtes de dialogue standard les plus connues. Nul doute que vous l'avez déjà rencontrée dans l'un de vos programmes favoris. La boîte de dialogue de sélection de police est gérée par la classe QFontDialog. Celle-ci propose en gros une seule méthode statique surchargée (il y a plusieurs façons de l'utiliser), comme vous pouvez le constater sur la doc de QFontDialog. Prenons le prototype le plus compliqué, juste pour la forme (QFont, bool ok) getfont (QFont def, QWidget parent, QString caption) Les paramètres se comprennent normalement assez facilement. 3.1.1 Valeurs de retour : La méthode renvoit la police sélectionnée : un objet de type QFont le booléen "ok" qui permet de savoir si l'utilisateur a cliqué sur OK ou a annulé. 3.1.2 Paramètres def : une police par défaut, objet de type QFont. parent : le widget parent de la boite de dialogue caption : la chaîne correspond au message qui sera affiché en haut de la fenêtre. Pour d'aller un peu plus loin, je propose que la police que nous aurons sélectionnée soit immédiatement appliquée au texte de notre bouton, par l'intermédiaire de la méthode setfont(). def ouvrirdialogue(self): police,ok=qfontdialog.getfont(self.boutondialogue.font(), self, "Choisissez une police") if ok : self.boutonquit.setfont(police) Comme vous l'avez remarqué que j'ai rajouté un bouton quit() à ma fenêtre principale.

La méthode getfont prend comme police par défaut celle qui est utilisée par notre bouton boutondialogue (rappelez-vous, font() est une méthode accesseur qui renvoie un QFont). On teste si l'utilisateur a bien validé la fenêtre, et si c'est le cas on applique la police qui vient d'être choisie à notre bouton. Attention le bouton ne se redimensionne pas tout seul. Vous pouvez le rendre plus large de base si vous voulez, ou bien le redimensionner après le choix de la police.

4 Sélectionner une couleur Dans la même veine que la sélection de police, on connaît probablement tous la boîte de dialogue "Sélection de couleur". Utilisez la classe QColorDialog et sa méthode statique getcolor(). QColor getcolor (QColor init = Qt.white, QWidget parent = None) Elle retourne un objet de type QColor. Vous pouvez préciser une couleur par défaut, en envoyant un objet de type QColor ou en utilisant une des constantes prédéfinies de couleur. En l'absence de paramètre, c'est la couleur blanche qui sera sélectionnée comme nous l'indique le prototype. Si on veut tester le résultat en appliquant la nouvelle couleur au bouton, c'est un petit peu compliqué. En effet, il n'existe pas de méthode setcolor pour les widgets, mais une méthode setpalette qui sert à indiquer une palette de couleurs. Je vous laisse vous renseigner plus amplement si vous le désirez sur la classe QPalette qui est intéressante. Le code que je vous propose ci-dessous ouvre une boîte de dialogue de sélection de couleur, puis crée une palette dont la couleur du texte correspond à la couleur qu'on vient de sélectionner, et applique enfin cette palette au bouton : def ouvrirdialogue(self): couleur=qcolordialog.getcolor(qt.white,self) palette=qpalette() palette.setcolor(qpalette.button, couleur) self.boutonquit.setpalette(palette) Une palette contient les règles pour colorer les différents éléments d'un widget. Plus précisément : une palette contient un groupe de couleur pour chaque état (Active, Disabled, et Inactive) du widget. Chacun de ces trois groupes de couleurs possède une description des couleurs attribuées aux différents éléments du widget. Les couleurs contenues dans un groupe sont : la couleur des boutons, du texte des boutons, du fond de la fenêtre, du texte de la fenètre, du texte en surbrillance, etc... Ainsi par exemple, l'instruction palette.setcolor(qpalette.button, couleur) demande de mettre la couleur des boutons de ''palette'' à la valeur ''couleur''. A chaque widget est ensuite associée une palette.

Le résultat de l'application est le suivant :

5 Sélection d'un fichier ou d'un dossier La sélection de fichiers et de dossiers est gérée par la classe QFileDialog qui propose elle aussi des méthodes statiques faciles à utiliser. Cette section sera divisée en 3 parties : Sélection d'un dossier existant Ouverture d'un fichier Enregistrement d'un fichier

5.1 Sélection d'un dossier existant (QFileDialog::getExistingDirectory) Le prototype, se trouve dans la doc On peut utiliser la méthode statique simplement comme ceci : def ouvrirdialogue(self): dossier = QFileDialog.getExistingDirectory(self) QMessageBox.information(self, self.trutf8("répertoire"), self.trutf8("vous avez sélectionné :\n")+dossier) Elle retourne un QString contenant le chemin complet vers le dossier demandé. La fenêtre qui s'ouvre devrait ressembler à cela :

5.2 Ouverture d'un fichier (QFileDialog::getOpenFileName) La célèbre boîte de dialogue "Ouverture d'un fichier" est gérée par getopenfilename(). Sans paramètres particuliers, la boîte de dialogue permet d'ouvrir n'importe quel fichier. Ce code demande d'ouvrir un fichier image. Le chemin vers le fichier est stocké dans un QString, que l'on affiche ensuite via une QMessageBox : def ouvrirdialogue(self): fichier = QFileDialog.getOpenFileName(self, "Ouvrir un fichier", "/home/puiseux/images", "Images (*.png *.gif *.jpg *.jpeg)") if fichier: QMessageBox.information(self, "Fichier", self.trutf8("vous avez sélectionné :\n") + fichier) self est le parent de la boîte Le titre de la fenêtre en second paramètre le nom du répertoire par défaut dans lequel l'utilisateur est placé Un filtre des fichiers. Seules les images de type PNG, GIF, JPG et JPEG s'afficheront. Le principe de cette boîte de dialogue est de vous donner le chemin complet vers le fichier, mais pas de vous ouvrir ce fichier. C'est à vous ensuite de faire les opérations nécessaires pour ouvrir le fichier et l'afficher dans votre programme. À noter aussi la fonction getopenfilenames (notez le "s" à la fin) qui autorise la sélection de plusieurs fichiers. La principale différence est qu'au lieu de retourner un QString, elle retourne un QStringList (liste de chaînes).

Résultat :

5.3 Enregistrement d'un fichier (QFileDialog::getSaveFileName) C'est le même principe que la méthode précédente, à la différence près que la personne peut cette fois spécifier un nom de fichier qui n'existe pas pour l'enregistrement. Le bouton "Ouvrir" est remplacé par "Enregistrer". QString fichier = QFileDialog::getSaveFileName(this, "Enregistrer un fichier", QString(), "Images (*.png *.gif *.jpg *.jpeg)");

Je vous avais promis un chapitre simple, vous avez eu un chapitre simple! En effet, les méthodes statiques ne sont rien d'autre que des "fonctions" comme en langage C, elles ne nécessitent donc pas de créer d'objets. Comme quoi, parfois le modèle objet est inadapté et ici c'était clairement le cas. Pour la plupart des classes que nous avons vues, on peut s'en sortir sans créer le moindre objet. Ces considérations mises à part, le modèle objet reste quoiqu'il en soit très pratique lorsqu'on crée des GUI comme on le fait là. A titre informatif, il existe quelques autres boîtes de dialogue usuelles un peu plus rares et surtout un peu plus complexes à utiliser. Je pense notamment à : QProgressDialog : affiche une boîte de dialogue avec une barre de progression et un bouton "Annuler". Cela permet de faire patienter l'utilisateur le temps qu'une longue opération s'exécute. Cette classe est très intéressante mais il vaut mieux qu'on la voie en pratique si on a l'occasion, car Qt cherche à estimer le temps restant pour savoir s'il doit afficher ou non la fenêtre. C'est plus intéressant de le voir dans un cas très concret donc. QWizard : affiche un assistant, avec les boutons "Suivant", "Précédent", "Terminer"... Là encore il vaut mieux avoir un projet concret pour apprendre à utiliser cette classe car elle est assez complexe. Ceci étant, vous pouvez aussi lire la documentation si vous en avez besoin maintenant, il y a tout ce qu'il faut dessus.