1. A propos de QTableWidget
La classe QTableWidget dans PyQt5 est une classe destinée à afficher et éditer des données tabulaires sous forme de table. Elle fournit une interface graphique pour afficher des données sous forme de lignes et de colonnes, souvent utilisée dans les applications GUI pour présenter des informations de manière structurée et organisée. Ainsi PyQt5 nous offre la classe QTableWidget afin de pouvoir gérer, organiser et afficher les données d'un tableau multidimensionnel d'une façon élégante et attrayante.
2. Création d'une simple table QTableWidget
Afin de créer un widget QTableWidget, on doit importer la classe QTableWideget et procéder à une instanciation:
1 |
from PyQt5.QtWidgets import QApplication, QWidget , QTableWidget , QTableWidgetItem |
Exemple
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import sys from PyQt5.QtWidgets import QApplication, QWidget , QTableWidget , QTableWidgetItem app = QApplication(sys.argv) root = QWidget() root.setWindowTitle("Exemple d'une table QTableView") root.setGeometry(100 , 100 , 500 , 300) # create a QTableWidget table = QTableWidget(root) table.setRowCount(2) table.setColumnCount(3) table.setGeometry(50 , 50 , 350 , 150) root.show() sys.exit(app.exec_()) |
3. Ajout de l'entête (header)
L'affichage d'une table QTableWidget peut être amélioré en ajoutant des entêtes à l'aide des méthodes:
- setHorizontalHeaderLabels() : Permet d'ajouter une entête horizontale
- setVerticalHeaderLabels() : Permet d'ajouter une entête verticale
Exemple
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import sys from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem app = QApplication(sys.argv) root = QWidget() root.setWindowTitle("Table Widget example !") root.setGeometry(100 , 100 , 500 , 300) # create a QTableWidget table = QTableWidget(root) table.setRowCount(2) table.setColumnCount(3) table.setGeometry(50 , 50 , 320 , 150) # adding header to the table headerH = ['ID' , 'Name' , 'email'] headerV = ['a' , 'b' ] table.setHorizontalHeaderLabels(headerH) table.setVerticalHeaderLabels(headerV) root.show() sys.exit(app.exec_()) |
4. Ajout des données
On peut aussi ajouter des données via la méthode setItem:
1 |
setItem(row_number , column_number , QTableWidgetItem("element_to_add")) |
4.1 Ajouter une ligne de données
Pour ajouter un élément à la première ligne et première colonne on utilise le code:
1 2 |
table = QTableWidget(root) setItem(0 , 0 , QTableWidgetItem("element")) |
Exemple (ajout d'une première ligne)
1 2 3 4 |
# adding a first row table.setItem(0 , 0 , QTableWidgetItem(' 1')) table.setItem(0 , 1 , QTableWidgetItem(' Albert Einstein')) table.setItem(0 , 2 , QTableWidgetItem(' albert_einstein@gmail.com')) |
4.2 Ajouter des données en lot
Les données à ajouter son généralement issues d'une base de données et sont groupées sur un tableau multidimentionnel ou un tableau de dictionnaires de données... Il est donc crucial de savoir comment les ajouter groupées en une seule fois
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 33 34 35 36 37 |
import sys from PyQt5.QtWidgets import QApplication, QWidget , QTableWidget , QTableWidgetItem app = QApplication(sys.argv) root = QWidget() root.setWindowTitle("Exemple d'une table QTableView") root.setGeometry(100 , 100 , 500 , 300) # create a QTableWidget table = QTableWidget(root) table.setRowCount(5) table.setColumnCount(3) # Ajout du header headerH = ['ID', 'Name', 'Email'] headerV = ['1', '2', '3', '4', '5'] table.setHorizontalHeaderLabels(headerH) table.setVerticalHeaderLabels(headerV) table.setGeometry(50 , 50 , 400 , 175) # Ajout des données groupées data = [('1' , 'Albert Einstein', 'albert_einstein@gmail.com'), ('2' , 'Adam', 'adam@gmail.com'), ('3' , 'Nathalie', 'nathalie@gmail.com'), ('4' , 'Majid', 'majid@gmail.com'), ('5' , 'Robert', 'robertn@gmail.com')] # initialiser le compteur n° de la ligne row_index = 0 for row in data: table.setItem(row_index, 0 , QTableWidgetItem(row[0])) table.setItem(row_index, 1 , QTableWidgetItem(row[1])) table.setItem(row_index, 2 , QTableWidgetItem(row[2])) row_index = row_index + 1 root.show() sys.exit(app.exec_()) |
5. QTableWidget 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 39 |
import sys from PyQt5.QtWidgets import QApplication, QWidget , QTableWidget , QTableWidgetItem class MyTable(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle("Exemple de QTableWidget") self.setGeometry(100, 100, 500, 300) self.table = QTableWidget(self) self.table.setRowCount(5) self.table.setColumnCount(3) self.table.setHorizontalHeaderLabels(['ID', 'Name', 'Email']) self.table.setVerticalHeaderLabels(['1', '2', '3', '4','5']) self.table.setGeometry(50, 50, 400, 200) if __name__ == '__main__': app = QApplication(sys.argv) root = MyTable() # ajout des données data = [('1' , 'Albert Einstein', 'albert_einstein@gmail.com'), ('2' , 'Adam', 'adam@gmail.com'), ('3' , 'Nathalie', 'nathalie@gmail.com'), ('4' , 'Majid', 'majid@gmail.com'), ('5' , 'Robert', 'robertn@gmail.com')] # initialiser le compteur de l'index de la ligne row_index = 0 for row in data: root.table.setItem(row_index, 0 , QTableWidgetItem(row[0])) root.table.setItem(row_index, 1 , QTableWidgetItem(row[1])) root.table.setItem(row_index, 2 , QTableWidgetItem(row[2])) row_index = row_index + 1 root.show() sys.exit(app.exec_()) |
6. Liste des méthodes et attributs associés à la classe QTableWidget
la classe QTableWidget possède de nombreuses méthodes et attributs permettant d'améliorer l'experience utilisateur. Nous vous donnerons ici une liste non exhaustive des méthodes et attributs les plus couramment utilisés. Sur le site officiel de PyQt, vous trouverez d'autres méthodes et attributs disponibles pour le widget QTableWidget en fonction des besoins spécifiques de votre application.
Méthodes :
- setItem(row, column, item): Définit l'élément à la position spécifiée par les coordonnées (ligne, colonne).
- item(row, column): Renvoie l'élément à la position spécifiée par les coordonnées (ligne, colonne).
- setHorizontalHeaderItem(column, item): Définit l'élément d'en-tête horizontal à la colonne spécifiée.
- setVerticalHeaderItem(row, item): Définit l'élément d'en-tête vertical à la ligne spécifiée.
- horizontalHeaderItem(column): Renvoie l'élément d'en-tête horizontal à la colonne spécifiée.
- verticalHeaderItem(row): Renvoie l'élément d'en-tête vertical à la ligne spécifiée.
- clear(): Efface toutes les données de la table.
- clearContents(): Efface le contenu des cellules sans supprimer les en-têtes.
- rowCount(): Renvoie le nombre de lignes dans la table.
- columnCount(): Renvoie le nombre de colonnes dans la table.
- insertRow(row): Insère une nouvelle ligne à la position spécifiée.
- removeRow(row): Supprime la ligne spécifiée.
- insertColumn(column): Insère une nouvelle colonne à la position spécifiée.
- removeColumn(column): Supprime la colonne spécifiée.
- selectRow(row): Sélectionne la ligne spécifiée.
- selectColumn(column): Sélectionne la colonne spécifiée.
- selectedItems(): Renvoie une liste des éléments sélectionnés dans la table.
- setItemDelegate(delegate): Définit le délégué utilisé pour le rendu et l'édition des éléments de la table.
Attributs :
- rowCount: Propriété en lecture seule renvoyant le nombre de lignes dans la table.
- columnCount: Propriété en lecture seule renvoyant le nombre de colonnes dans la table.
- currentItem: Propriété renvoyant l'élément actuellement sélectionné.
- selectionModel: Propriété renvoyant le modèle de sélection utilisé par la table.
Younes Derfoufi
CRMEF OUJDA