Ce premier exemple permet d'introduire quelques concepts de base.
En premier lieu, il faut indiquer à Python d'importer les librairies PyQt et sys. Ceci est fait avec les lignes suivantes :
from PyQt4.QtCore import * from PyQt4.QtGui import * import sys
main
Nous définissons ensuite une méthode main qui s'occupera de gérer l'ensemble du programme. Cette méthode crée en premier lieu une instance de QApplication
. Cette instance représente l'ensemble de notre application, par conséquent elle est essentielle et doit rester unique pour assurer un fonctionnement correct. Toute application PyQt est constituée d'un objet de type QApplication
. Par conséquent, une application débute toujours par la création d'un objet de la classe QApplication
:
app=QApplication(args)
Veuillez noter toutefois que si vous développez une classe dans laquelle la référence vers QApplication
n'est pas disponible (typiquement lors de la création de votre propre widget), Qt met à disposition la variable qApp
fournissant une référence vers l'application Qt. Vous pouvez donc sans autre utiliser cette variable dans votre code.
Un bouton est un objet de la classe QPushButton
créé comme tout autre objet par l'appel de son constructeur :
button=QPushButton("Hello World !", None)
Les widgets ne sont pas visibles lors de leur création, c'est pourquoi la méthode show
de la classe QWidget
est appliquée à l'objet button
afin de le rendre visible. Néanmoins, si vous déclarez un widget comme enfant d'un autre, un appel à show sur le parent affichera automatiquement tous ses enfants.
button.show()
L'exemple utilise deux événements : l'application quitte lorsque l'utilisateur clique sur le bouton précédemment défini ou lorsqu'il ferme la fenêtre. La méthode statique connect
de la classe QObject
établit une communication unidirectionnelle entre deux objets. À chaque objet de la classe QObject
ou de ses classes dérivées, peuvent être associés des signaux permettant d'envoyer des messages et des slots permettant de recevoir des messages. De manière plus rigoureuse, un slot correspond à tout élément pouvant être appelé tandis qu'un signal est le message qui est passé entre objets. Le fonctionnement est le suivant : les objets héritant de QObject
émettent des signaux quand ils reçoivent des événements. Ces signaux peuvent être connectés à des slots, qui sont donc appelés automatiquement quand l'objet reçoit un événement donné. L'objet émetteur du signal ne se soucie pas de l'existence d'un objet susceptible de recevoir son signal. Cela assure une bonne encapsulation ainsi qu'un mécanisme modulaire. Un même signal peut être connecté à plusieurs slots, tout comme plusieurs signaux peuvent viser le même slot. Dans le cas de notre exemple, deux signaux sont connectés au même slot :
#fin de l'application lorsque toutes les fenêtres sont fermées app.connect(app,SIGNAL("lastWindowClosed()"),app,SLOT("quit()")) #fin de l'application lorsque l'utilisateur clique sur le bouton app.connect(button, SIGNAL("clicked()"),app,SLOT("quit()"))
Les signaux « lastWindowClosed()
» de l'objet app et « clicked()
» de l'objet button
sont tous deux connectés au slot « quit()
» par l'appel à la méthode connect. Lorsque les widgets sont définis, la méthode exec_
de la classe QApplication
met en place la boucle d'événements. C'est grâce à cette boucle (infinie) que l'application va fonctionner et que les divers événements auront le comportement voulu.
#boucle principale de traitement des évènements app.exec_()