2013-02-27 5 views
0

J'utilise une tableview avec le modèle associé étendu avec QSortFilterProxyModel en raison du tri et/ou du filtrage. Tout fonctionne bien sauf les numéros de ligne (je veux dire en-tête verticale). En utilisant le code suivant:QSortFilterProxyModèle et numéros de ligne

def headerData(self, section, orientation, role): 
    if role == QtCore.Qt.DisplayRole: 
     if orientation == QtCore.Qt.Horizontal: 
      return self.__header[section] 
     elif orientation == QtCore.Qt.Vertical: 
      return section + 1 

numéro de la ligne fixe est affectée à chaque ligne. Et cela provoque des problèmes lors du tri/filtrage. J'ai trouvé une solution: remplacer les méthodes de filtrage et de tri par défaut et mettre un paramètre supplémentaire (numéro de ligne) dans les données et le réécrire pendant chaque tri ou filtrage.

Question: existe-t-il une autre solution pour cela? Une méthode qui me montre la position réelle de l'objet après la manipulation de tri/filtrage?

+0

Avez-vous vraiment besoin de ces en-têtes? Ce serait beaucoup plus simple si vous ajoutiez une autre colonne dans votre modèle pour le 'numéro de ligne'. – Avaris

+0

Oui, je préfère les en-têtes plutôt que les cellules car cela semble plus intuitif – Miso

+0

Attendez ... Je pense que j'ai mal compris. 'QSortFilterProxyModel' conserve les nombres originaux intacts. Mais tu ne veux pas ça? Vous voulez que le numéro de ligne passe de "1" à "N" après le tri, quel que soit l'emplacement de la ligne d'origine, n'est-ce pas? – Avaris

Répondre

3

Une sous-classe simple QSortFilterProxyModel avec la coutume headerData ferait que:

class MyProxy(QtGui.QSortFilterProxyModel): 
    def headerData(self, section, orientation, role): 
     # if display role of vertical headers 
     if orientation == QtCore.Qt.Vertical and role == QtCore.Qt.DisplayRole: 
      # return the actual row number 
      return section + 1 
     # for other cases, rely on the base implementation 
     return super(MyProxy, self).headerData(section, orientation, role) 
+0

Non, pas exactement - Je me concentre sur l'en-tête vertical qui est le même que le mien dans votre exemple. – Miso

+0

@Miso: Vous vous rendez compte, c'est le modèle 'Proxy', n'est-ce pas? – Avaris

+0

Ceci est un exemple de code complet: http://pastebin.com/TFzkYyJT – Miso