Trucs et astuces pour PyQt 4.4

Christophe Kibleur

Quelques bouts de code, par-ci par-là, qui me servent d'aide-mémoire sous PyQt4.

N'hésitez pas à commenter cet article !
Commentez

- Titre : Trucs et astuces pour PyQt 4.4

- Auteur : Christophe Kibleur

- Parution : 27 avril 2008

- Mise à jour : 17 avril 2011

- Licence : Copyright ® 2008 Christophe Kibleur. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Transformer son fichier ui en code Python exécutable

- II. Les fichiers de ressources

- III. Créer un fichier principal pour lancer l'application

- IV. Traduire son application

- V. Un Emacs keybinding en deux coups de cuillère à pot

- VI. Remerciements

I - Transformer son fichier ui en code Python exécutable

Très simple, il suffit de lancer cette commande :

pyuic4 -o ui_fichier.py -x fichier.ui

Le fait de faire précéder le nom du fichier Python par ui_ est une convention que je vous conseille fortement de suivre. Vous saurez ainsi à vue d'œil si ce fichier a été automatiquement généré ou non.

Le fichier ainsi généré ne comporte qu'une classe, qui se nomme Ui_XXX, où XXX est le nom donné dans le designer au widget racine de l'arborescence.

II - Les fichiers de ressources

pyrcc4 est l'équivalent PyQt de l'utilitaire Qt rcc et est utilisé exactement de la même façon. pyrcc4 lit le fichier .qrc et les fichiers ressources et produit un module Python qui doit seulement être importé par l'application afin que ces ressources soient disponibles comme s'il s'agissait des fichiers originaux.

Pyrcc4 ne sera inclus que si votre copie de Qt inclut le module XML.

Une fois le fichier de ressources créé dans QtDesigner, nommons-le fichier.qrc. Il vous suffira de lancer la commande suivante pour le compiler. Attention au nom du fichier Python ainsi créé, il est suivi de _rc.

pyrcc4 fichier.qrc -o fichier_rc.py

Pourquoi le nommer ainsi ? Lancez votre programme principal généré à l'étape précédente. Vous verrez que celui-ci suppose que le nom du fichier de ressources est le nom du fichier rc (ici fichier), suivi de _rc.

Bien sûr, on peut aussi modifier le fichier principal pour que celui-ci importe un autre nom. Mais c'est une mauvaise idée, étant donné que celui-ci est généré automatiquement. Il convient donc de prendre de bonnes habitudes dès à présent.

III - Créer un fichier principal pour lancer l'application

Il suffit de créer un fichier comme celui-ci (à condition que votre fichier généré se nomme ui_fichier) :

# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui, QtCore
from ui_fichier import Ui_MainWindow

class MonAppli(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
Ui_MainWindow.__init__(self)

# Configure l'interface utilisateur.
self.setupUi(self)

if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = MonAppli()
window.show()
sys.exit(app.exec_())

et le tour est joué !

IV - Traduire son application

Le procédé de traduction d'une application PyQt4 s'opère en plusieurs étapes distinctes.

- Création d'un fichier projet portant l'extension pro ; par exemple pour l'application reStInPeace (reStInPeace.pro) :

FORMS            += ui_restester.ui
FORMS            += ui_about.ui
FORMS            += ui_converter.ui
FORMS            += ui_preferences.ui
SOURCES          += reStInPeace.py
TRANSLATIONS     += reStInPeace_fr_FR.ts

- Lancer pylupdate4 sur le fichier le fichier .pro :

pylupdate4 reStInPeace.pro

Nous obtenons ainsi en sortie un fichier reStInPeace_fr_FR.ts, l'extension ts signifie translation (traduction, en français).

- Maintenant, il nous faut lancer l'utilitaire QLinguist et charger le fichier ts précédent. La traduction s'opère alors par le biais d'une GUI. Une fois traduite, enregistrer son fichier et aller dans le menu File/Release pour générer un binaire de traduction portant l'extension qm.

- Il ne reste plus qu'à charger la traduction au lancement de l'application (j'ai placé ce bout de code dans la boucle main de mon application) :

## Translation process
locale = QtCore.QLocale.system().name()
qtTranslator = QtCore.QTranslator()
if qtTranslator.load("qt_" + locale):
app.installTranslator(qtTranslator)
appTranslator = QtCore.QTranslator()
if appTranslator.load("reStInPeace_" + locale):
app.installTranslator(appTranslator)

- Votre application détecte alors automatiquement quelle est la langue par défaut sur votre système et charge la traduction le cas échéant.

V - Un Emacs keybinding en deux coups de cuillère à pot

Pour créer un raccourci clavier facilement, on utilise QKeySequence, comme ici :

QtGui.QKeySequence("Ctrl+E"))

Et on l'associe ensuite à une action.

Ce que vous ne saviez peut-être pas, c'est que QKeySequence peut prendre en charge plusieurs arguments séparés par une virgule. On peut aller ainsi jusqu'à quatre combinaisons de touches à la fois.

On pourra ainsi définir de faire une action quelconque sur la combinaison Alt+X suivi de Ctrl+C en définissant notre QKeySequence par :

QtGui.QKeySequence("Alt+X, Ctrl+C")

Ce qui nous donne un joli Emacs keybinding sans aucun effort supplémentaire.

VI - Remerciements

Un tout grand merci à Karzoff pour sa relecture orthographique !