La disposition en PyQt
Introduction
Le chapitre Inventaires des widgets PyQt nous a permis d’inventorier les principaux contrôles (pour rappel ceux-ci sont nommés « widgets ») dans un contexte PyQt. Dans cet inventaire, nous avons vu que la disposition sur la fenêtre se faisait sans mode opératoire particulier. Jusqu’à maintenant, on place nos widgets à un point de coordonnées donné, en indiquant en général les coordonnées du coin gauche du widget manipulé.
Cette approche a ses limites et est sous certains aspects peu pratique. C’est pour cela que des widgets de disposition (layout widgets) existent en PyQt pour permettre d’agencer facilement les fenêtres développées. Ce type de contrôle dédié à l’organisation et à la structuration visuelle d’une fenêtre va constituer l’essentiel du contenu de ce chapitre.
Inventaire des widgets de disposition en PyQt
1. QHBoxLayout et QVBoxLayout
a. Introduction
Les deux premiers widgets de disposition que nous allons étudier sont QHBoxLayout et QVBoxLayout. Ils sont traités conjointement, car d’une part ils dérivent de la même classe QBoxLayout et d’autre part ils obéissent tous deux à la même logique de disposition. Cette logique de disposition est horizontale pour QHBoxLayout et verticale pour QVBoxLayout.
Les documentations en ligne des classes QBoxLayout, QHBoxLayout, QVBoxLayout sont respectivement aux adresses suivantes :
https://doc.qt.io/qt-5/qboxlayout.html
b. Premier exemple avec QVBoxLayout
Commençons par déclarer les classes dont nous allons avoir besoin.
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton,
QVBoxLayout
Créons une application et une fenêtre.
app = Qapplication([])
fenetre = QWidget()
Nous pouvons alors créer un objet de disposition verticale, c’est-à-dire que les widgets seront ajoutés les uns après les autres et selon une orientation verticale.
disposition = QVBoxLayout()
En l’occurrence, on ajoute cinq boutons qui seront ainsi alignés les uns après les autres, verticalement.
disposition.addWidget(QPushButton('Premier'))
disposition.addWidget(QPushButton('Second'))
disposition.addWidget(QPushButton('Troisième'))
disposition.addWidget(QPushButton('Quatrième'))
disposition.addWidget(QPushButton('Cinquième'))
Puis on associe notre objet de disposition à notre fenêtre grâce à la fonction QVBoxLayout.
fenetre.setLayout(disposition)
Enfin, on affiche la fenêtre. À aucun moment la disposition n’a nécessité l’utilisation de coordonnées relatives pour chacun des widgets mis en place.
fenetre.show()
Le code global est le suivant :
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton,
QVBoxLayout
app = Qapplication([])
fenetre = QWidget()
disposition = QVBoxLayout()
disposition.addWidget(QPushButton('Premier'))
disposition.addWidget(QPushButton('Second'))
disposition.addWidget(QPushButton('Troisième')) ...