Magazine

PyQT et comment trier une QTable

Publié le 04 mai 2008 par Mikebrant

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.


Retour à La Une de Logo Paperblog

A propos de l’auteur


Mikebrant 9 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte