salut a tous, comment je peux faire ça :
qtablewidget set sorting disable pour une colonne spécifique
salut a tous, comment je peux faire ça :
qtablewidget set sorting disable pour une colonne spécifique
Bonjour,
Voilà une solution. Dans cet exemple, on interdit le tri des colonnes 3 et 5.
On utilise un héritage de QTableWidgetItem, dont on surcharge la méthode __lt__ (="lesthan) qui appartient à PyQt et non à Qt. Pour que ça marche, il faut donc que toutes les cases concernées soient des QTableWidgetItem.
En cherchant une solution, je me suis aperçu que les possibilités de tri ou de filtrage des données sont très limités avec le QTableWidget, contrairement au QTableView. Mais ce dernier a d'autres sources de complexités.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 #!/usr/bin/python3 # -*- coding: utf-8 -*- import sys from random import randint from PyQt5 import (QtWidgets, QtGui, QtCore) ############################################################################# class TableWidgetItem(QtWidgets.QTableWidgetItem): # ======================================================================= def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.pasdetricols = [] # ======================================================================= def __lt__(self, other): if self.column() in self.pasdetricols: return False else: a = self.data(QtCore.Qt.DisplayRole) b = other.data(QtCore.Qt.DisplayRole) return (a < b) ############################################################################# class Fenetre(QtWidgets.QWidget): # ======================================================================= def __init__(self, parent=None): super(Fenetre, self).__init__(parent) self.resize(800, 600) self.tableWidget = QtWidgets.QTableWidget(self) self.nbrow, self.nbcol = 7, 7 self.tableWidget.setRowCount(self.nbrow) self.tableWidget.setColumnCount(self.nbcol) for row in range(0, self.nbrow): for col in range(0, self.nbcol): val = str(randint(1000, 9999)) item = TableWidgetItem(val) item.pasdetricols = [3, 5] # <= interdit le tri des colonnes 3 et 5 self.tableWidget.setItem(row, col, item) self.tableWidget.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) # MultiSelection) posit = QtWidgets.QGridLayout() posit.addWidget(self.tableWidget, 0, 0) self.setLayout(posit) self.tableWidget.setSortingEnabled(True) self.tableWidget.setFocus() self.tableWidget.setCurrentCell(0, 0) ############################################################################# if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) fen = Fenetre() fen.show() sys.exit(app.exec_())
salut tyrtamos;
Désolé, je n'ai pas répondu à vos réponses car j'étais occupé ces jours-ci et je ne pouvais pas utiliser l'ordinateur
Merci beaucoup Le problème a été résolu par le merveilleux code que vous m'avez fourni
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager