| 12
 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