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 !