Installation de la bibliothèque
Pour débuter avec PySide2, l'installation s'effectue simplement via le gestionnaire de paquets pip :
pip install PySide2
Référentiel de documentation
La documentation officielle de Qt for Python constitue une ressource essentielle pour maîtriser l'API :
https://doc.qt.io/qtforpython/
Workflow de développement avec Qt Designer
La création d'une interface graphique repose sur trois phases principales :
- Conception visuelle avec Qt Designer.
- Conversion du fichier
.uien module Python. - Intégration et initialisation de la fenêtre dans le script principal.
Conception de la vue
L'utilitaire Qt Designer est fourni avec le paquet PySide2. Il se trouve généraelment dans le chemin d'installation de Python, sous Lib\site-packages\PySide2\designer.exe. Il est possible de le lier en tant qu'outil externe dans des EDI comme PyCharm pour plus d'efficacité.
Après avoir lancé l'application, créez un nouveau formulaire. Glissez-déposez un objet QLabel et un QPushButton sur la fenêtre, puis sauvegardez le fichier sous le nom main_window.ui.
Génération du code Python
La conversion du fichier XML généré par Designer en code Python se fait via la commande pyside2-uic dans un terminal positionné à la racine du projet :
pyside2-uic main_window.ui -o interface_generee.py
Cette commande produit un fichier contanant une classe représentant l'interface. Voici un exemple du résultat généré avec une structure adaptée :
from PySide2.QtCore import QRect, QMetaObject, QCoreApplication
from PySide2.QtWidgets import QWidget, QPushButton, QLabel
class GeneratedInterface(object):
def setup_ui(self, container):
if not container.objectName():
container.setObjectName("Container")
container.resize(450, 350)
self.action_btn = QPushButton(container)
self.action_btn.setObjectName("action_btn")
self.action_btn.setGeometry(QRect(180, 220, 90, 30))
self.info_lbl = QLabel(container)
self.info_lbl.setObjectName("info_lbl")
self.info_lbl.setGeometry(QRect(170, 100, 150, 25))
self.translate_ui(container)
QMetaObject.connectSlotsByName(container)
def translate_ui(self, container):
container.setWindowTitle(QCoreApplication.translate("Container", "Fenêtre Principale", None))
self.action_btn.setText(QCoreApplication.translate("Container", "Cliquez ici", None))
self.info_lbl.setText(QCoreApplication.translate("Container", "Bienvenue !", None))
Exécution et affichage de la fenêtre
Pour afficher l'interface, il faut instancier l'objet généré et le lier à une classe héritant de QMainWindow :
import sys
from interface_generee import GeneratedInterface
from PySide2.QtWidgets import QApplication, QMainWindow
class AppMainWindow(QMainWindow):
def __init__(self):
super(AppMainWindow, self).__init__()
self.ui_instance = GeneratedInterface()
self.ui_instance.setup_ui(self)
if __name__ == '__main__':
app_context = QApplication(sys.argv)
main_win = AppMainWindow()
main_win.show()
sys.exit(app_context.exec_())
Avec cette méthode, l'interface graphique est séparée de la logique applicative. Il est à noter que les composants créés avec des positions absolues ne s'adapteront pas auotmatiquement lors du redimensionnement de la fenêtre, nécessitant l'usage de gestionnaires de disposition (layouts) pour un rendu fluide.