2010-11-14 4 views
0

J'ai un QTreeView dans lequel je souhaite filtrer le contenu. Je souhaite seulement filtrer ces contenus sur les enfants de niveau supérieur (ceux immédiatement au-dessous de l'index de racine). Actuellement, j'accomplis cela en créant une méthode de filtrage simple dans ma sous-classe QTreeView et en masquant sélectivement les lignes qui ne correspondent pas.QTreeView: Filtrage du contenu - recherche de bonnes pratiques

Alors que l'approche ci-dessus semble bien fonctionner, je me demande si je devrais ré-implémenter cela en utilisant un QSortFilterProxyModel. Si oui, quels seraient les avantages?

Si je change d'utiliser le QSortFilterProxyModel, j'ai quelques (espérons-petits) questions:

1) Depuis que je suis filtrage que sur les enfants de haut niveau, je dois réimplémenter quelle que soit la méthode était en train de faire le tri afin de laisser tous les petits-enfants seuls, n'est-ce pas?

2) Mon modèle de données comporte un certain nombre de méthodes personnalisées qui sont responsables de la navigation au clavier unique et similaire. Est-ce que je les réimplémente dans le modèle de proxy et les fais pointer vers les méthodes de mon modèle de données? Si oui, comment puis-je référencer le modèle? Je n'arrive pas à trouver quelque chose de comparable à la méthode model() de QTreeView.

Merci!

Répondre

0

L'utilisation d'une classe dérivée de QSortFilterProxyModel est préférable. Vous gardez les responsabilités de tri en dehors de votre arborescence.

Pour réutiliser au maximum, le code existant, vous pouvez remplacer filterAcceptsRow comme celui-ci

bool MySortFilterProxyModel::filterAcceptsRow(int sourceRow, 
    const QModelIndex &sourceParent) const 
{ 
    if(sourceParent.IsValid()) return true; // Don't filter other than top level 

    return QSortFilterProxyModel(sourceRow, sourceParent); 
} 

Pour les méthodes personnalisées, vous aurez besoin de les mettre en œuvre dans votre procuration. Ensuite, pour la navigation, vous devrez peut-être utiliser mapToSource et mapFromSource pour convertir l'index de proxy en index de modèle original

Questions connexes