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
| #!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from fnmatch import fnmatchcase
from PyQt4 import QtCore, QtGui, QtSql
#############################################################################
class MonProxyModel(QtGui.QSortFilterProxyModel):
"""ProxyModel pour ajouter des méthodes de tri et de filtrages particuliers
s'interpose entre le modèle et le QTableView
"""
#========================================================================
def __init__(self, parent=None):
super(MonProxyModel, self).__init__(parent)
#========================================================================
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.filterRegExp().patternSyntax() in [QtCore.QRegExp.Wildcard, QtCore.QRegExp.WildcardUnix]:
# motif de référence à comparer pour le filtrage
motif = unicode(self.filterRegExp().pattern())
# récup du drapeau qui dit si on filtre en tenant compte de la case
okmajusc = (self.filterCaseSensitivity()==0)
# correction du motif si on ne tient pas compte de la case
if okmajusc:
motif = motif.upper()
# rôle du filtrage (par défaut: QtCore.Qt.DisplayRole)
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
col1, col2 = col, col+1
else:
# ici, le filtrage s'exerce sur toutes les colonnes
col1, col2 = 0, self.columnCount(sourceParent)
# traitement de la ou des colonne(s)
for col in xrange(col1, col2):
# 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, role).toString())
# correction de l'item si on ne tient pas compte de la case
if okmajusc:
item = item.upper()
# si plusieurs colonnes: il suffit d'un seul résultat=True pour retenir la ligne
if fnmatchcase(item, motif):
return True
# ici, aucun item n'a donné un résultat satisfaisant
return False
#--------------------------------------------------------------------
else:
# exécution du filtrage prédéfini
return QtGui.QSortFilterProxyModel.filterAcceptsRow(self, sourceRow, sourceParent) |
Partager