PyQt/Traduction de Qt à PyQt
À ce stade du guide vous devriez déjà avoir un bon aperçu des possibilités de la librairie PyQt. Cependant, il existe encore une multitude de classes Qt disponibles, permettant entre autre de gérer les dates, de se connecter à une base de données, de faire du traitement d'images, etc. Néanmoins, l'explication de ces classes sort du cadre de ce document.
Nous vous proposons ici une méthode vous permettant d'appréhender rapidement la documentation Qt afin d'écrire du code python. En effet, il est relativement aisé d'interpréter la documentation de référence en Python étant donné que la librairie Qt utilise toutes les possibilités de l'orienté objet mis à disposition par le langage C++. Avec les quelques explications qui suivent vous devriez être en mesure de comprendre l'ensemble de la documentation de référence Qt (http://web.archive.org/web/20031226145340/http://doc.trolltech.com/3.3/groups.html et http://qt-project.org/doc/qt-4.8/classes.html) et créer ainsi vos propres exemples.
S'y retrouver dans la documentation de référence
modifierLa documentation de référence contient une multitude de documents, comme entre autre la documentation de référence sur l'API (regroupée par groupes, annotations, héritages, etc.), quelques tutoriels de base, des explications plus avancées sur les concepts de la librairie, les utilitaires disponibles, etc. La partie qui nous intéresse ici pour obtenir de la documentation sur les modules disponibles est la section intitulée API Reference. Elle contient les sections suivantes :
- All Classes : Contient la liste de l'ensemble des classes disponibles dans Qt, avec pour chaque classe un lien vers sa documentation. Utile si vous connaissez le nom de la classe qui vous intéresse.
- Main Classes : Liste des classes les plus utilisées.
- Grouped Classes : Permet de naviguer dans les classes par regroupement de classes ayant un domaine d'action similaire (groupes pour les widgets de base, la gestion du temps, etc.).
- Annotated Classes : Permet d'obtenir l'ensemble des classes avec pour chacune une brève description.
- Inheritance Hierarchy : Liste représentant les relations d'héritage C++ entre les diverses classes.
- Class Chart : Graphique représentant la hiérarchie de l'ensemble des classes disponibles ; possibilité de cliquer sur le nom d'une classe pour obtenir directement sa documentation.
- All Functions : Ensemble des fonctions membres de toutes les classes de la librairie, classées par ordre alphabétique.
- Header File Index : Liens vers les fichiers d'entêtes C++; peu utile dans notre cas car la plupart des informations à connaître pour une classe sont indiquées dans la documentation.
- FAQs : Foire aux questions sur la librairie.
- Change History Document : Indique les modifications effectuées à la librairie Qt à chaque nouvelle version.
Importer les librairies
modifierComme vous avez sûrement dû le remarquer, la première étape consiste en l'importation des librairies Qt. Elle est effectuée par l'intermédiaire des lignes suivantes :
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
Il est certes peu performant pour le démarrage de votre application d'importer l'ensemble des librairies Qt, cependant, pour le côté pratique de la chose nous le recommandons tout de même. Libre à vous de chercher après coup les modules utilisés et d'inclure seulement ceux nécessaires. Soyez néanmoins conscient que l'ensemble de la librairie Qt sera chargée en mémoire, car la version 3 est encore une librairie monolithique. La version 4 ne souffre plus de ce « problème ».
Comprendre la documentation d'une classe
modifierLa page de documentation contient beaucoup d'informations concernant la classe. Elle commence par une petite explication sur ce que fait la classe sélectionnée. Vient ensuite une ligne indiquant le fichier d'entête C++ à inclure. Par exemple :
#include <QCheckbox>
Cette ligne est simplement à ignorer en Python. Elle indique en effet au compilateur C++ dans quel (s) fichier (s) sont définis les prototypes des classes utilisées. Vous pouvez par contre vous baser sur cette information pour créer les lignes d'importation des modules Python.
Viennent ensuite les méthodes disponibles pour la classe.
Les méthodes qui ne retournent aucune valeur et dont le nom est identique à la classe sont les constructeurs.
Il en existe plusieurs, permettant de mettre des paramètres à l'objet nouvellement créé.
Afin de les utiliser en Python il suffit de les appeler avec les bons paramètres.
Ne prenez pas garde au mot clé const
devant un paramètre, de même que les caractères & et * qui n'ont pas de sens en Python.
Ce qui est important est uniquement le type du paramètre.
Lorsqu'un paramètre contient le caractère = cela veut dire qu'il a une valeur par défaut si elle n'est pas spécifiée dans l'appel au constructeur. Si vous désirez prendre la valeur par défaut d'un paramètre il faudra le spécifier avec le mot clé réservé None. Cependant, vous pouvez ne pas spécifier les paramètres par défaut après le dernier paramètre vous intéressant. Un exemple est le suivant :
grp = QCheckBox("checkbox 1", None, "check1")
Le reste des méthodes sont des méthodes applicables à la classe, à appeler soit en préfixant la méthode par l'objet sur lequel vous désirez l'appliquer, soit en utilisant le mot réservé self qui indique l'objet courant. La documentation de référence liste ensuite les signaux et les slots disponibles. Il y a peu de choses à retenir à ce sujet à part le fait que pour leur utilisation il faut obligatoirement utiliser le prototype C++ et non pas le convertir en python. Par exemple, si vous avez un signal défini comme tel :
void dockWindowPositionChanged ( QDockWindow * dockWindow )
Son utilisation dans une méthode connect()
se fera de la manière suivante :
app.connect(qApp, SIGNAL("dockWindowPositionChanged(QDockWindow *)"),
qApp,SLOT("quit()"))
Code C++ en Python
modifierDans la documentation de référence il se trouve quelques exemples mettant en œuvre des classes Qt. Afin de traduire le code C++ en Python, vous pouvez appliquer les quelques règles suivantes :
- les commentaires
/* ... */
et// ...
sont à remplacer par des commentaires python# ...
placés après les premières lignes (shebang line et encodage du fichier) ; - les doubles deux-points (
::
) ainsi que les flèches (->
) sont à remplacer par un point (.
) ; - supprimer les mots clés new ;
- remplacer | par or et & par and ;
- adapter les appels de méthodes à la syntaxe python.
Sous-classe implantant une classe Qt
modifierLa méthode la plus simple pour utiliser un objet d'une classe spécifique est de créer directement un objet de cette classe. Il suffit de faire appel au constructeur de la classe en question en lui passant les paramètres corrects pour obtenir un objet. Cependant, il peut être utile de définir vos propres classes qui héritent d'une ou de plusieurs classes Qt afin de spécialiser le comportement de certains widgets, voire de définir votre propre widget. Pour cela, l'étape la plus important est l'appel au (x) constructeur (s) de la (des) classe (s) parente (s). Une fois ces appels effectués vous aurez alors l'ensemble des méthodes des parents à disposition. L'utilisation de votre widget n'est ensuite pas différente de l'utilisation de n'importe quel objet Python.
Définir ses propres signaux et slots
modifierComme vu dans la partie concepts de base, les signaux et les slots sont extrêmement puissants et simples à utiliser.
À l'instar de C++ où il faut passer par un compilateur méta-objet pour transformer les signaux et slots en fonctions C++, en Python il n'en est rien.
Les signaux sont de simples chaînes de caractères, tandis que pour définir un slot il suffit de définir une méthode sur la classe voulue.
Notez tout de même un point important : si vous désirez dans un de vos propre widget connecter un des signaux et des slots mais que vous n'avez pas de référence vers l'objet QApplication
définissant l'application dans son ensemble, vous pouvez utiliser la variable qApp
, qui est une référence automatiquement convertie vers QApplication
.