1 - PyQt - Positionnement absolu
Le positionnement absolu mesure la position et la taille de chaque widget en pixels. Lorsque vous utilisez le positionnement absolu, vous devez comprendre les limitations suivantes :
- Le redimensionnement de la fenêtre ne modifie pas la taille et la position du widget.
- Les applications peuvent sembler différentes sur différentes plates-formes.
- Changer la police de l'application peut casser la mise en page.
- Si vous souhaitez modifier la mise en page, vous devez la rafraîchir complètement, ce qui est très fastidieux.
2 - Les layouts PyQt5
Afin de résoudre les problème ci-dessus, PyQt5 offre un ensemble de classes permettant de gérer avec efficacité les différents widgets:
- QGridLayout: un objet de classe GridLayout se présente avec une grille de cellules disposées en lignes et en colonnes. La classe contient la méthode addWidget(). N'importe quel widget peut être ajouté en spécifiant le nombre de lignes et de colonnes de la cellule.
- QVBoxLayout: permet d'organiser les widgets verticalement
- QHBoxLayout: permet d'organiser les widgets horizontalement
- QFormLayout: est un moyen pratique de créer un formulaire à deux colonnes, où chaque ligne se compose d'un champ de saisie associé à une étiquette. Par convention, la colonne de gauche contient le libellé et la colonne de droite contient un champ de saisie.
3 - Le gestionnaire de position QGridLayout PyQt5
Un objet de la classe GridLayout se présente sous forme d'une grille de cellules disposées en lignes et en colonnes. La classe contient la méthode addWidget(). N'importe quel widget peut être ajouté en spécifiant le numéro de lignes et de colonnes de la cellule.
Syntax d'ajout d'un widget
1 2 |
grid = QGridLayout() grid.addWidget(QWidget_objet, number row, number column) |
Exemple
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
import sys from PyQt5.QtWidgets import QApplication , QWidget, QLabel, QLineEdit , QGridLayout, QPushButton # Create a pyQt5 application app = QApplication(sys.argv) win = QWidget() win.setWindowTitle("Example of QGridlayout") win.setGeometry(100 , 100 ,500 ,300) # create a QGridLayout object grid = QGridLayout() win.setLayout(grid) # Creation of widgets button1 = QPushButton(win) button1.setText("Button 1") grid.addWidget(button1 , 0 , 0 ) button2 = QPushButton(win) button2.setText("Button 2") grid.addWidget(button2 , 1 , 0 ) button3 = QPushButton(win) button3.setText("Button 3") grid.addWidget(button3 , 0 , 1 ) button4 = QPushButton(win) button4.setText("Button 4") grid.addWidget(button4 , 1 , 1 ) win.show() sys.exit(app.exec_()) |
Remarque
Les dimensions et les positions des boutons sont dynamiques c'est-à-dire qu'elles changent lorsque la fenêtre est redimensionnée. Pour résoudre ce problème, nous devons appliquer le gridLayout à un objet frame fixe.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout, QFrame def window(): app = QApplication(sys.argv) win = QWidget() win.setGeometry(50,50,500,400) win.setWindowTitle("PyQt5 QGridLayout Example") frame = QFrame(win) frame.setGeometry(10, 10 , 300 , 200) grid = QGridLayout() frame.setLayout(grid) button1 = QPushButton(win) button1.setText("Button 1") grid.addWidget(button1 , 0 , 0 ) button2 = QPushButton(win) button2.setText("Button 2") grid.addWidget(button2 , 1 , 0 ) button3 = QPushButton(win) button3.setText("Button 3") grid.addWidget(button3 , 0 , 1 ) button4 = QPushButton(win) button4.setText("Button 4") grid.addWidget(button4 , 1 , 1 ) win.show() sys.exit(app.exec_()) if __name__ == '__main__': window() |
4 - QGridLayout selon l'approche objet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout, QFrame class Window(QWidget): def buildWindow(self , win): win.setWindowTitle("Grid Layout Example !") win.setGeometry(50,50,500,400) self.frame = QFrame(win) self.frame.setGeometry(20 , 20 , 300 , 200) self.grid = QGridLayout() self.frame.setLayout(self.grid) self.button1 = QPushButton(win) self.button1.setText("Button1") self.grid.addWidget(self.button1 , 0 , 0) self.button2 = QPushButton(win) self.button2.setText("Button 2") self.grid.addWidget(self.button2 , 1 , 0 ) self.button3 = QPushButton(win) self.button3.setText("Button 3") self.grid.addWidget(self.button3 , 0 , 1 ) self.button4 = QPushButton(win) self.button4.setText("Button 4") self.grid.addWidget(self.button4 , 1 , 1 ) if __name__ == '__main__': app = QApplication(sys.argv) win = QWidget() myWindow = Window() myWindow.buildWindow(win) win.show() app.exec_() |
Younes Derfoufi
CRMEF OUJDA