Range moi la baraque
Un court article sur le tri de qTable contenant des int ou float.
J'ai pas mal cherché, et trouvé .
Il suffit de créer une classe, qui hérite de QTableWidgetItem, et de surcharger la méthode __lt__()
Et pour conclure (qui n'a jamais voulu conclure aussi vite? ) un exemple:
#-*- coding:Utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
class MonItem(QTableWidgetItem):
""" notre item personnalisé """
def __init__(self,maValeur,monType):
QTableWidgetItem.__init__(self,maValeur)
self.monType=monType
def __lt__(self,autre):
maValeur=self.monType( self.text() )
monAutreValeur=self.monType( autre.text() )
if maValeur < monAutreValeur :
return True
return False
class MaFenetre(QWidget):
"""Ma Fenetre principale"""
def __init__(self):
""" à l'initialisation"""
QWidget.__init__(self)
self.setWindowTitle('Tue moi')#le titre de la fenêtre
self.showMaximized()# met l'appli en taille maximale
##### la QTable #####
self.maTable=QTableWidget()
#on crée notre table
self.maTable.setColumnCount(3)
#la table sera composée de 3 colonnes
self.maTable.setHorizontalHeaderLabels(['Des chiffres(int)','Encore des chiffres(float)','Et des lettres'])
#les noms des colonnes
self.maTable.resizeColumnsToContents()
#taille des colonnes à l'échelle des titres
self.maTable.setSortingEnabled(True)
#on peut trier
self.maTable.sortItems(0,Qt.AscendingOrder)
#on trie par ordre croissant,table triée par défaut par là 1ere colonne
##### calque #####
monCalque=QVBoxLayout()
#notre calque
monCalque.addWidget(self.maTable)
#ainsi que la table
self.setLayout(monCalque)
#on fait de monCalque le calque principal de la fenêtre
#####on ajoute des lignes#####
self.ajoutLigne()
def ajoutLigne(self):
maListe=[[0,13.0,'qui'],[1,28.97,'saura'],[2,0.01,'QTableWidget'],[3,68,'Item'],[4,9.76,'Fin'] ]#une petite liste
for liste in maListe:
i=0#notre compteur de colonne
ligne = self.maTable.rowCount()#compte le nombre de ligne
self.maTable.insertRow(ligne)#on ajoute une ligne
for element in liste:
item=MonItem(str(element),type(element) )
self.maTable.setItem(ligne,i,item)
i+=1
if __name__=='__main__':
monAppli=QApplication(sys.argv)
maFenetre=MaFenetre()#on instancie notre fenêtre
maFenetre.show()#on la montre
sys.exit(monAppli.exec_())
Je vais juste expliquer la classe MonItem, le reste étant hors sujet.
MonItem prend 2 arguments:
maValeur : c'est la valeur que l'on veut afficher dans notre case
monType : c'est le type de maValeur (str, float, ....)
Après, on surcharge la méthode __lt__() (less than), qui prend 2 arguments:
self : l'item actuel
autre : le suivant
On caste leurs valeur suivant monType que l'on a donné.
Et il nous reste plus qu'à les comparer.
Voilà tout.