Bonjour à tous

Suite à une disussion récente à propos d'un tri de QTableWidget et d'une astucieuse solution proposée par tyrtamos, j'ai voulu appliquer cette solution à mes TableWidget.

Le souci, c'est que la solution initiale de tyrtamos fonctionne nickel, mais quand je l'intégrais dans mes objets Qt, j'avais en retour une table à moitié vide.

J'ai galéré pendant plusieurs jours à chercher le pourquoi du comment, et je viens de trouver. Le souci se produit quand on crée le QTableWidget avec un nombre de colonnes défini et qu'on active le sort. Si on le crée avec 0 colonnes puis qu'on positionne ensuite le nombre de colonnes, tout va bien. De même on peut le créer avec un nombre de colonnes précis, si on n'active pas le sort alors là aussi tout va bien.

Exemple
Code python : 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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
 
class Fenetre(QWidget):
	class __TableWidgetItem(QTableWidgetItem):
		def __init__(self, sortCols, *args, **kwargs):
			super().__init__(*args, **kwargs)
			self.__sortCols=sortCols
 
		def __lt__(self, other):
			return self.__sortCols[self.column()](self.data(Qt.DisplayRole)) < self.__sortCols[self.column()](other.data(Qt.DisplayRole))
		# __lt__()
	# class __TableWidgetItem
 
	__tabCols=(
		{
			"calc" : lambda x, row, col: ("val(%d)" % x, x),
			"sort" : str,
		},
		{
			"calc" : lambda x, row, col: ("val(%d) * row(%d)" % (x, row), x*row),
			"sort" : str,
		},
		{
			"calc" : lambda x, row, col: ("val(%d) * row(%d) + col(%d)" % (x, row, col), x*row+col),
			"sort" : int,
		},
		{
			"calc" : lambda x, row, col: ("val(%d) * col(%d)" % (x, col), x*col),
			"sort" : int,
		},
		{
			"calc" : lambda x, row, col: ("val(%d) * col(%d) + row(%d)" % (x, col, row), x*col+row),
			"sort" : int,
		},
	)
	def __init__(self, rows=10, *args, **kwargs):
		super().__init__(*args, **kwargs)
 
		self.resize(600, 300)
 
		self.__tableWidget=QTableWidget(0, len(Fenetre.__tabCols), parent=self)				# Ici problème
		self.__tableWidget.setSortingEnabled(True)
		posit=QVBoxLayout(self)
		posit.addWidget(self.__tableWidget, 0)
 
		# Remplissage QTableWidget
		self.__sortCols=tuple(x["sort"] for x in Fenetre.__tabCols)
		self.__load(rows*2)
		self.__load(rows)
	# __init__()
 
	# Remplissage table
	def __load(self, rows):
		self.__tableWidget.clearContents()
		self.__tableWidget.setRowCount(rows)
		val=0
		for row in range(rows):
			for col in range(len(Fenetre.__tabCols)):
				val+=1
				calc=Fenetre.__tabCols[col]["calc"](val, row, col)
				item=Fenetre.__TableWidgetItem(self.__sortCols, str(calc[1]))
				item.setToolTip(
					"(%s = %d), sort=%s" % (
						calc[0],
						calc[1],
						self.__sortCols[col],
					)
				)
				#item.setData(Qt.UserRole, val)
				self.__tableWidget.setItem(row, col, item)
			# for
		# for
	# __load()
# class Fenetre
 
# Programme principal
if __name__ == "__main__":
	app=QApplication(sys.argv)
	fen=Fenetre(rows=int(sys.argv[1])) if len(sys.argv) > 1 else Fenetre()
	fen.show()
	sys.exit(app.exec_())
# if

Le QTableWidget est créé en ligne 46 avec un nombre de colonnes précis => il apparait quasiment vide.

Si en revanche je le crée ainsi self.__tableWidget=QTableWidget(0, 0, parent=self) et que je rajoute en dessous self.__tableWidget.setColumnCount(len(Fenetre.__tabCols)) alors plus de souci.

Une idée du pourquoi du comment?

Merci à tous

PS: Je suis sous qt v5.11.3, sip v4.19.14 et pyqt v5.11.3