J'utilise un QSortfilterProxymode pour filtrer les résultats d'un QabstractListModel. Cependant, j'aimerais retourner une première entrée qui n'est pas présente dans le modèle d'origine, c'est-à-dire que c'est artificiel.
C'est ce que j'ai jusqu'à présent: p>
Extra Element Account 1 Account 2 ...
3 Réponses :
J'ai fait cela, seulement au travail, donc je ne peux donc pas vous donner beaucoup de code. Je peux vous donner l'idée générale de quoi faire.
Cela fonctionne mieux si vous subglasses QabstractProxyDel , qui est conçu pour la manipulation générale, ne pas trier ou filtrer. Vous voudrez remplacer RowCount, et aussi besoin de remplacer les colonnes (bien que cela ne puisse simplement retourner les informations du modèle source). Vous aurez besoin de remplacer la fonction de données et de renvoyer vos propres données pour la première ligne ou d'appeler le modèle source une fois de plus. P>
Vous voudrez remplacer les fonctions MapEfomSource et MapTosource, pour permettre la commutation entre le Index du modèle proxy et index de modèle source. P>
Pour faire une implémentation robuste, vous devez créer des emplacements et se connecter aux signaux du modèle source pour la modification des données, la réinitialisation du modèle et les lignes / colonnes sur les lignes / colonnes sur le point d'être inséré / enlevé. Vous devez ensuite émettre vos propres signaux, les adapter correctement à votre rangée supplémentaire. P>
Dans notre classe, nous avons fait le texte pour la première rangée réglable, afin que nous puissions utiliser le même modèle de proxy dans différentes situations. . Cela vaut la peine d'enquêter sur le vôtre, car il ajoute un effort minimal. P>
par demande commentée, un regard approfondie de Maptosource et Mapfromsource. C'est approximativement ce que vous devez penser. P> // Remember that this maps from the proxy's index to the source's index,
// which is invalid for the extra row the proxy adds.
mapToSource( proxy_index ):
if proxy_index isn't valid:
return invalid QModelIndex
else if proxy_index is for the first row:
return invalid QModelIndex
else
return source model index for (proxy_index.row - 1, proxy_index.column)
mapFromSource( source_index ):
if source_index isn't valid:
return invalid QModelIndex
else if source_index has a parent:
// This would occur if you are adding an extra top-level
// row onto a tree model.
// You would need to decide how to handle that condition
return invalid QModelIndex
else
return proxy model index for (source_index.row + 1, source_index.column)
Je suis également allé ce chemin, mais j'ai un peu perdu avec Mapefrom / Mapto Fonctions: -S Pouvez-vous ajouter des détails supplémentaires à ce sujet, même si vous ne pouvez pas afficher le code? L'idée générale devrait être suffisante :-) Merci!
Parce que j'ai eu un peu du mal à la mise en œuvre de cela et que je ne pouvais trouver aucun autre code d'échantillon dans l'ensemble du net, je pose cet exemple de mise en œuvre.
J'espère que cela aide les autres aussi ... p> salutations
Sven p> p>
J'ai eu le même genre de problème récemment et j'ai beaucoup de problèmes avec les parents et mappée avec le modèle source.
Ma version doit gérer des colonnes virtuelles à gauche, quelques-unes liées aux actions, et éventuellement une est une case à cocher. p>
espère que cela puisse aider quelqu'un aussi aussi :) p>
Pourtant, une note au sage, je suis sous-classant un qsortfilterproxymodel, et ce faisant, je semble perdre la capacité d'utiliser sorte. Je suppose que c'est parce que je remplace les méthodes d'index / de données. Si je passe à la sous-classement qidentityproxymodel au lieu, ajoutez ensuite un qsortfilterproxymodel après, je perds la possibilité de vérifier / décocher ma colonne de case à cocher ... Même si les indicateurs sont définis sur qt :: Itemisenabled | Qt :: ItemmisserCheckable | QT :: détaillée ... Digressy Toujours :) P>
QModelIndex GenericProxy::mapToSource(const QModelIndex & proxy) const {
if(not proxy.isValid())
return QModelIndex();
if((action || checkbox)) {
int column = proxy.column() - addedCount();
if(column < 0) // this index is local.
return QModelIndex();
QModelIndex idx = sourceModel()->index(proxy.row(), column, mapToSource(proxy.parent()));
return idx ;
}
QModelIndex idx = sourceModel()->index(proxy.row(), proxy.column(), mapToSource(proxy.parent()));
return idx;
}
QModelIndex GenericProxy::mapFromSource(const QModelIndex & source) const {
if(not source.isValid())
return QModelIndex();
if((action || checkbox)) {
// simply add appropriate informations ..
int column = source.column() + addedCount();
QModelIndex idx = index(source.row(), column, mapFromSource(source.parent()));
return idx;
}
QModelIndex idx = index(source.row(), source.column(), mapFromSource(source.parent()));
return idx;
}
GenericItem * GenericProxy::convert(const QModelIndex & idx) const {
if(idx.isValid())
return _convert(index(idx.row(), firstRealColumn(), idx.parent()));
else
return _convert(idx);
}
// _convert doesn't take care of index not really at the rightplace_ness :)
GenericItem * GenericProxy::_convert(const QModelIndex & index) const {
if(not index.isValid())
return dynamic_cast<GenericModel *>(sourceModel())->convert(QModelIndex());
return static_cast<GenericItem*>(index.internalPointer());
}
QModelIndex GenericProxy::parent(const QModelIndex & item) const {
if(not item.isValid())
return QModelIndex();
GenericItem * child = _convert(item);
if(!child)
return QModelIndex();
GenericItem * parent = child->parentItem();
if(parent == _convert(QModelIndex()))
return QModelIndex();
int column = addedCount();
return sourceModel()->parent(mapToSource(createIndex(item.row(), column, parent )));
}
QModelIndex GenericProxy::index(int row, int column, const QModelIndex & parent) const {
if( not hasIndex(row,column,parent))
return QModelIndex();
GenericItem * pitem = convert(parent);
GenericItem * pchild = pitem->child(row);
if(pchild)
return createIndex(row, column, pchild);
else
return QModelIndex();
}
Je ne suis pas sûr que le QsortfilterProxymodel est le meilleur endroit pour essayer de le faire. Les termes opérationnels étant trier i> et filtre i>. Je pense que cela dans un modèle personnalisé serait mieux.