2017-01-26 1 views
1

J'essaie de sélectionner des éléments de vue d'élément abstrait dans Qt étant donné leurs valeurs de chaîne. J'ai déjà écrit la fonction qui trouve QModelIndex en fonction de son contenu de chaîne.Sélectionne par programme QModelIndexes dans QAbstractItemView

J'essaie maintenant de mettre tous ces QModelIndex es que je trouve dans la sélection unique. Ma signature de la méthode:

// Will select all items that contain any of the strings 
    // given by 1st argument 
    virtual void selectItems(const QStringList&) override; 

Ma mise en œuvre ressemble à ceci (mais ne fonctionne pas correctement):

void QAbstractItemViewResult::selectItems(const QStringList& list) 
{ 
    if(list.size() > 0) { 
     QItemSelectionModel::SelectionFlags flags = QItemSelectionModel::ClearAndSelect; 
     QItemSelection selection; 
     Q_FOREACH(const QString text, list) { 
      // Find index by string is a method I implemented earlier 
      // The method works correctly 
      QModelIndex index(findIndexByString(targetView_, list[0])); 
      if(index.isValid()) { 
       // This is an attempt to add model indx into selection 
       selection.select(index, index); 
      } 
     } 
     // When the selection is created, this should select it in index 
     targetView_->selectionModel()->select(selection, flags); 
    } 
} 

Le problème est, ce code sélectionne toujours seulement le premier élément de la liste, par exemple. pour "B1","C1","A1" il ressemble à ceci:

image description

Le tableau a permis la sélection multiple:

image description

Alors, comment puis-je sélectionner plusieurs éléments correctement programme? Si vous avez besoin du code findIndexByString, il peut être trouvé ici: https://github.com/Darker/qt-gui-test/blob/master/results/QAbstractItemViewResult.cpp#L5

Répondre

3

Vous effacez la sélection à chaque itération.

remplacerons:

QItemSelectionModel::SelectionFlags flags = QItemSelectionModel::ClearAndSelect; 

par:

QItemSelectionModel::SelectionFlags flags = QItemSelectionModel::Select; 

EDIT: Vous passez list[0] au lieu de text:

findIndexByString(targetView_, list[0]) 

Par ailleurs, vous devez utiliser un const référence dans votre boucle:

Q_FOREACH(const QString &text, list) { 

Ou la version native si vous utilisez 11 C++ ou supérieure:

for (const QSring &text : list) { 
+0

Les drapeaux ne sont pas utilisé dans la boucle. –

+0

Vous avez raison. J'ai édité ma réponse. – rom1v

+0

Merci beaucoup. Le problème principal était probablement le 'list [0]' restant. Au fait, 'ClearAndSelect' fonctionne bien. Je ne suis pas à 100% mais je pense que "Select" ajouterait une nouvelle sélection à la sélection existante. –