salut a tous, comment je peux faire ça :
qtablewidget set sorting disable pour une colonne spécifique
Version imprimable
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:
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