2011-04-20 2 views
2

J'ai un modèle de type QStandardItemModel qui ressemble à ceci:Trier QStandardItemModel en C++ Qt

  QHash<int, QByteArray> roleNames; 
      roleNames[Car2goVehicle::NameRole] = "plate_number"; 
      roleNames[Car2goVehicle::DescriptionRole] = "address"; 
      roleNames[Car2goVehicle::FuelRole] = "fuel"; 
      roleNames[Car2goVehicle::InteriorRole] = "interior"; 
      roleNames[Car2goVehicle::ExteriorRole] = "exterior"; 
      roleNames[Car2goVehicle::VinRole] = "vin"; 
      roleNames[Car2goVehicle::LatRole] = "lat"; 
      roleNames[Car2goVehicle::LonRole] = "lon"; 
      roleNames[Car2goVehicle::DistanceRole] = "distance"; 
      d->m_vehiclesmodel = new RoleItemModel(roleNames); 

et maintenant je veux trier selon la distance comme celui-ci

  d->m_vehiclesmodel->setSortRole(Qt::UserRole); 
      d->m_vehiclesmodel->sort(Car2goVehicle::DistanceRole, Qt::AscendingOrder); 

Mais le résultat est faux . Quelqu'un peut-il me dire comment trier?

Merci.

Répondre

4

Quel est le problème avec le résultat? Dans la plupart des cas, on ne triera pas le modèle lui-même, mais la vue, en utilisant un QSortFilterProxyModel. Voici l'exemple de la documentation:

QTreeView *treeView = new QTreeView; 
MyItemModel *sourceModel = new MyItemModel(this); 
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this); 

proxyModel->setSourceModel(sourceModel); 
treeView->setModel(proxyModel); 

Dans votre exemple ci-dessus, vous pouvez mélanger des rôles et des colonnes. Votre rôle ENUM devrait ressembler à ceci:

enum Role { 
    NameRole=Qt::UserRole, 
    DistanceRole, 
    ... 
}; 

Si vous voulez trier le rôle de la distance, vous appelez:

model->setSortRole(Car2goVehicle::DistanceRole); 

Ensuite, trier par une colonne (qui n'a rien à voir avec le rôle) , Par exemple colonne 0:

model->sort(0, Qt::AscendingOrder); 
+0

Vous pouvez même dire, indépendamment de la façon dont vous triez votre modèle, la vue peut choisir de l'afficher d'une autre manière. C'est pourquoi vous devez utiliser 'QSortFilterProxyModel'. – RedX

+0

J'ai aussi utilisé QSortFilterProxyModel mais mon modèle est trié selon Car2goVehicle :: NameRole et non Car2goVehicle :: DistanceRole – Temirlan

+0

Termirlan: Vous confondez des colonnes avec des rôles? J'ai ajouté un paragraphe sur votre extrait de code ci-dessus. –

0

Je ne vous recommandons d'utiliser QSortFilterProxyModel, si QStandardItemModel::sort() est assez puissant. Au lieu de cela, je m'en tiens aux signaux Qt de base.

Ici, j'utilise PyQt, mais le code devrait également fonctionner en C++:

self.model = QStandardItemModel() 
self.populate_model() 
self.model.setHorizontalHeaderLabels(map(str, range(self.model.rowCount()))) 
self.treeview.setModel(self.model) 
self.treeview.header().setSectionsClickable(True) 
self.treeview.header().setSortIndicatorShown(True) 
self.treeview.header().sortIndicatorChanged.connect(self.model.sort) 

Avis de la dernière ligne de connexion avec QStandardItemModel::sort.

Questions connexes