2017-09-21 5 views
1

J'ai implémenté un QSortFilterProxyModel personnalisé pour trier un QStandardItemModel. J'ai remplacé la fonction lessThan(), car j'ai besoin de la trier en fonction de plusieurs rôles et pas seulement d'un seul. Par exemple, je trier les entrées par une valeur de priorité, et celles qui ont la même priorité sont triées en fonction de leur horodatage.C++ - Modification du tri pour QSortFilterProxyModel personnalisé

Maintenant, que dois-je faire si je veux trier par une autre valeur, par exemple par une valeur de nom dans l'ordre alphabétique?

Je pensais que je pouvais y parvenir simplement en séparant les différents cas dans la fonction lessThan:

bool MyProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const 
{ 
    if (sorting_by_priority) 
    { 
     // compare priority roles 
    } 
    else 
    { 
     // compare name roles 
    } 
} 

Et que mon faire quelque chose comme la fonction de tri de commutateur ceci:

void MyProxyModel::switchSort(bool b) 
{ 
    sort_by_priority = b; 
    sort(0, Qt::AscendingOrder); 
} 

Mais cela ne faire quelque chose (rien n'est re-trié après avoir appelé cette fonction), donc évidemment ce n'est pas la bonne approche. (oui, setDynamicSortFilter est activé)

J'ai travaillé autour de cela en créant deux modèles de proxy, l'un trié par priorité, l'autre par son nom, et j'ai simplement basculer entre les deux. Mais je réalise que c'est une solution extrêmement inélégante et qu'il doit y avoir quelque chose de beaucoup plus simple. Mais depuis que je suis encore très nouveau à Qt et la documentation est un peu écrasante, peut-être quelqu'un peut me diriger dans la bonne direction?

+2

Avez-vous essayé [QSortFilterProxyModel :: invalidate] (http://doc.qt.io/qt-5/qsortfilterproxymodel.html#invalidate)? –

+0

J'ai maintenant, et ça marche! –

Répondre

0

Vous devez appeler QSortFilterProxyModel::invalidate pour indiquer que le tri actuel est invalidé, c'est-à-dire qu'une nouvelle action de tri doit être effectuée.

Notez que l'appel sort explicitement également fonctionner lorsque dynamicSortFilter est faux ou que vous spécifiez une autre colonne ou de l'ordre comme on peut le voir dans le code:

void QSortFilterProxyModel::sort(int column, Qt::SortOrder order) 
{ 
    Q_D(QSortFilterProxyModel); 
    if (d->dynamic_sortfilter && d->proxy_sort_column == column && d->sort_order == order) 
     return; 
    d->sort_order = order; 
    d->proxy_sort_column = column; 
    d->update_source_sort_column(); 
    d->sort(); 
} 
+0

Merci beaucoup! –