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
|
class MonProxyModel(QtGui.QSortFilterProxyModel):
"""ProxyModel pour ajouter des méthodes de tri et de filtrages particuliers
s'interpose entre le model et le QTableView
"""
#========================================================================
def __init__(self, parent=None):
super(MonProxyModel, self).__init__(parent)
# initialise le filtre simil mais le désactive par défaut
self.filtreSimil()
#========================================================================
def filtreSimil(self, oksimil=False, ratiosimil=0.70):
"""configure le filtre simil"""
self.oksimil = oksimil
self.ratiosimil = ratiosimil
#========================================================================
def filterAcceptsRow(self, sourceRow, sourceParent):
"""Surcharge de la méthode de filtrage des lignes de la table
source_row: int, source_parent: QModelIndex
retour: True si la ligne est retenue, False sinon
"""
#--------------------------------------------------------------------
if self.oksimil:
# filtrage par comparaison similaire avec ratio de similitude
# mot de référence à comparer pour le filtrage
mot = unicode(self.filterRegExp().pattern())
# récup du drapeau qui dit si on filtre en tenant compte de la case
okmajusc = (self.filterCaseSensitivity()==0)
# role de filtrage
role = self.filterRole()
# index de la colonne sur laquelle s'exerce le filtrage (-1=toutes)
col = self.filterKeyColumn()
if col>=0:
# ici, le filtrage ne s'exerce que sur la colonne d'index col
# fonction d'index de la ligne et de la colonne en cours
index = self.sourceModel().index(sourceRow, col, sourceParent)
# valeur à filtrer
#item = unicode(self.sourceModel().data(index, QtCore.Qt.DisplayRole).toString())
item = unicode(self.sourceModel().data(index, role).toPyObject())
# retour selon le résultat du test de similitude
return simil(item, mot, self.ratiosimil, okmajusc)
else:
# ici, le filtrage s'exerce sur toutes les colonnes
# nombre total de colonnes
nbcol = self.columnCount(sourceParent)
# traitement de toutes les colonnes
for col in xrange(0, nbcol):
# fonction d'index de la ligne en cours d'examen
index = self.sourceModel().index(sourceRow, col, sourceParent)
# valeur à filtrer de la ligne en cours
#item = unicode(self.sourceModel().data(index, QtCore.Qt.DisplayRole).toString())
item = unicode(self.sourceModel().data(index, role).toPyObject())
# il suffit d'un seul résultat=True pour retenir la ligne
if simil(item, mot, self.ratiosimil, okmajusc):
return True
# ici, aucun item des colonnes n'a donné une similitude suffisante
return False
#--------------------------------------------------------------------
# on peut ajouter ici la partie "filtrage par wildcard" avec un elif
#--------------------------------------------------------------------
else:
# exécution du filtrage prédéfini
return QtGui.QSortFilterProxyModel.filterAcceptsRow(self, sourceRow, sourceParent) |
Partager