PySide Simplissimus : combiner la licence, à propos et fermer

PySide Simplissimus : des tutoriels d'une dizaine de minutes pour un débutant par un débutant

| Traducteur : Thibaut Cuvelier | Qt Developer Network |

Ici, on combine les trois scripts précédents en un seul miniprogramme, que l'on nomme combine.

Commentez

- Titre : PySide Simplissimus : combiner la licence, à propos et fermer

- Auteurs : Traducteur : Thibaut Cuvelier, Qt Developer Network

- Parution : 14 mai 2011

- Mise à jour : 7 juillet 2011

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

Sommaire

- I. L'article original

- II. Combiner

- III. Implémenter ces fonctionnalités

- IV. Remerciements

I - L'article original

Le Qt Developer Network est un réseau de développeurs utilisant Qt afin de partager leur savoir sur ce framework. Vous pouvez le consulter en anglais.

Nokia, Qt, Qt Quarterly et leurs logos sont des marques déposées de Nokia Corporation en Finlande et/ou dans les autres pays. Les autres marques déposées sont détenues par leurs propriétaires respectifs.

Cet article est la traduction de Combine - Licence, About and Close.

II - Combiner

La première tâche est d'utiliser Qt Designer pour créer un formulaire et l'enregistrer dans un fichier combine.ui. Cette fois, on y met une barre de menus Fichier, avec les éléments Show GPL, About et Close. Qt Designer dispose d'un outil de connexion de signaux et de slots. Là, on sélectionne des menus déroulants action_Close pour Sender, triggered pour Signal; MainWindow comme Receiver et close() comme Slot.

Dans un vocabulaire Qt, les divers clics et autres actions envoient des signaux, qui doivent être connectés à l'action que l'on veut y associer. L'endroit où le signal est reçu s'appelle le slot. Pour la conception de GUI, on utilise généralement les signaux standard fournis. Un signal aussi général est déclenché par l'utilisateur.

Les signaux sont connectés aux slots et, avec PySide, cela peut être n'importe quelle méthode Python, bien que, dans notre exemple, il s'agisse d'une réaction de la part de MainWindow, qui se ferme, ainsi terminant l'exécution du programme.

Le formulaire est sauvegardé en tant que combine.ui. Il doit être ensuite converti en fichier lisible par Python :

pyside-uic combine.ui > ui_combine.py

Le fichier ui_combine.py peut être lu par Python et est raisonnablement compréhensible pour un humain aussi. Il est assez instructif de voir ce programme en action, c'est pourquoi en voici le listing.

#!/usr/bin/env python
# combine.py - combination of ShowGPL, About, Close scripts

import sys
import platform

import PySide
from PySide.QtGui import QApplication, QMainWindow, QTextEdit,\
QPushButton,  QMessageBox

__version__ = '0.0.1'

from ui_combine import Ui_MainWindow

class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)

if __name__ == '__main__':
app = QApplication(sys.argv)
frame = MainWindow()
frame.show()
app.exec_()

Le programme en lui-même ne fait qu'une quinzaine de lignes et la plupart des choses que l'on y fait sont standard, on les réutilisera donc souvent. C'est utile et instructif de lancer ce programme et de s'assurer que tout est parfait. On peut tenter de lancer tous les items du menu, mais un seul fait quelque chose - Close. Pour les autres, il faut fournir le code approprié, voici notre prochaine étape :

#!/usr/bin/env python
# combine.py - combination of ShowGPL, About, Close scripts
# Copyright note omitted.

import sys
import platform

import PySide
from PySide.QtGui import QApplication, QMainWindow, QTextEdit,\
QPushButton,  QMessageBox

__version__ = '0.0.2'
from ui_combine import Ui_MainWindow

class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.actionShow_GPL.triggered.connect(self.showGPL)
self.action_About.triggered.connect(self.about)

def showGPL(self):
'''Read and display GPL licence.'''
self.textEdit.setText(open('COPYING.txt').read())

def about(self):
'''Popup a box with about message.'''
QMessageBox.about(self, "About PyQt, Platform and the like",
"""<b> About this program </b> v %s
<p>Copyright © 2010 Joe Bloggs.
All rights reserved in accordance with
GPL v2 or later - NO WARRANTIES!
<p>This application can be used for
displaying OS and platform details.
<p>Python %s -  PySide version %s - Qt version %s on %s""" % \
(__version__, platform.python_version(), PySide.__version__,\
PySide.QtCore.__version__, platform.system()))

if __name__ == '__main__':
app = QApplication(sys.argv)
frame = MainWindow()
frame.show()
app.exec_()

On a simplement ajouté les méthodes about et showGPL et on les a connectées avec ces deux déclarations :

self.actionShow_GPL.triggered.connect(self.showGPL)
self.action_About.triggered.connect(self.about)

Le programme est maintenant complètement fonctionnel, on pourrait se féliciter et passer à autre chose, si la GUI avait meilleur aspect. La plupart des interfaces disposent d'autres manières d'effectuer les actions disponibles dans les menus, des boutons ou des barres d'outils avec des icônes qui déclenchent les actions voulues. Aussi, quand la souris arrive à proximité d'une telle icône, il est courant d'afficher une infobulle pour dire ce que fait cette icône et de montrer un petit message dans la barre d'état que la MainWindow fournit par défaut.

III - Implémenter ces fonctionnalités

Dans cette partie du tutoriel, on va s'attaquer à la méthode pour fournir des barres d'outils avec des icônes actives et des messages, tant à proximité des icônes qu'en bas de la fenêtre. Tout d'abord, on a besoin d'icônes : peu de gens croient en la réinvention de la roue, trouvons donc un paquet d'icônes déjà prêtes. Le choix fait ici est le set d'icônes Tango, librement disponible.

C'est une collection assez grande d'icônes que les auteurs mettent à disposition sans restriction sur la licence. Elle devrait couvrir nos besoins et même plus. C'est pratique de mettre les icônes sélectionnées dans une petite bibliothèque, que l'on peut appeler tango_select. De manière analogue au fichier combine.ui avec Qt Designer, on crée un fichier de ressource avec n'importe quel éditeur de texte (le bloc-note, kate, gedit ou autre), combine.qrc. Bien que ce soit du XML, il est dans un format simple qui peut être copié et modifié simplement.

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file alias="quit.png">select_tango/32x32/actions/system-log-out.png</file>
<file alias="about.png">select_tango/32x32/apps/preferences-system-session.png</file>
<file alias="showgpl.png">select_tango/32x32/apps/help-browser.png</file>
</qresource>
</RCC>

Par exemple, l'icône pour l'action quit pourra être référencée dans le programme par son alias, quit.png. Cela utilisera le fichier system-log-out.png de la collection d'icônes. On peut maintenant compiler, comme combine.ui, ce fichier comme suit :

pyside-rcc combine.qrc > qrc_combine.py

Le fichier qrc_combine.py est alors simplement importé dans le programme, comme montré ci-dessous.

#!/usr/bin/env python
# combine.py - combination of ShowGPL, About, Close scripts

# Copyright notice removed to save space.

import sys
import platform

import PySide
from PySide.QtGui import QApplication, QMainWindow, QTextEdit, QPushButton,\
QMessageBox,  QIcon

__version__ = '0.0.3'
from ui_combine import Ui_MainWindow
import qrc_combine

class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.actionShow_GPL.triggered.connect(self.showGPL)
self.action_About.triggered.connect(self.about)
iconToolBar = self.addToolBar("iconBar.png")
#------------------------------------------------------
# Ajouter les icônes qui doivent apparaître dans la barre d'outils - étape 1
self.actionShow_GPL.setIcon(QIcon(":/showgpl.png"))
self.action_About.setIcon(QIcon(":/about.png"))
self.action_Close.setIcon(QIcon(":/quit.png"))
#------------------------------------------------------
# Montrer le message dans la barre de statut - étape 2
self.actionShow_GPL.setStatusTip("Show GPL Licence")
self.action_About.setStatusTip("Pop up the About dialog.")
self.action_Close.setStatusTip("Close the program.")
#------------------------------------------------------
iconToolBar.addAction(self.actionShow_GPL)
iconToolBar.addAction(self.action_About)
iconToolBar.addAction(self.action_Close)

def showGPL(self):
'''Read and display GPL licence.'''
self.textEdit.setText(open('COPYING.txt').read())

def about(self):
'''Popup a box with about message.'''
QMessageBox.about(self, "About PyQt, Platform and the like",
"""<b> About this program </b> v %s
<p>Copyright © 2010 Joe Bloggs.
All rights reserved in accordance with
GPL v2 or later - NO WARRANTIES!
<p>This application can be used for
displaying OS and platform details.
<p>Python %s -  PySide version %s - Qt version %s on %s""" % \
(__version__, platform.python_version(), PySide.__version__,\
PySide.QtCore.__version__, platform.system()))

if __name__ == '__main__':
app = QApplication(sys.argv)
frame = MainWindow()
frame.show()
app.exec_()

Les images sont ajoutées aux actions dans la première étape :

#------------------------------------------------------
# Ajouter les icônes qui doivent apparaître dans la barre d'outils - étape 1
self.actionShow_GPL.setIcon(QIcon(":/showgpl.png"))
self.action_About.setIcon(QIcon(":/about.png"))
self.action_Close.setIcon(QIcon(":/quit.png"))
#------------------------------------------------------

De la même manière, les textes des infobulles sont ajoutés à l'étape seconde :

#------------------------------------------------------
# Montrer le message dans la barre de statut - étape 2
self.actionShow_GPL.setStatusTip("Show GPL Licence")
self.action_About.setStatusTip("Pop up the About dialog.")
self.action_Close.setStatusTip("Close the program.")
#------------------------------------------------------

Un dessin valant mieux qu'un long discours, le script combine.py fini affiche la GUI suivante :

C'est instructif de retirer le code des deux étapes et de lancer le programme, en observant son comportement :

IV - Remerciements

Merci à Claude Leloup pour sa relecture attentive !