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?
Avez-vous essayé [QSortFilterProxyModel :: invalidate] (http://doc.qt.io/qt-5/qsortfilterproxymodel.html#invalidate)? –
J'ai maintenant, et ça marche! –