Retrait d'une ligne d'un QAbstractItemModel : index non mis à jour

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

J'ai une class TreeModel qui hérite de QAbstractItemModel. Une instance de cette class est passé en modèle à une QTreeView. Lorsque je sélectionne un élément - currentChanged -, un signal est envoyé, le QModelIndex courant est stocké dans une variable puis, grosso modo, j'affiche un widget avec un bouton "Supprimer".

Au clique sur ce dernier, je lis le contenu de currentIndex et l'enlève de l'instance de mon TreeModel. Ainsi, quand j'ai deux élément dans mon arbre, supprimer le premier fonctionne et fait sélectionner le second - qui devient premier. Mais quand je réitère le clique, ça ne fonctionne plus et on remarque que l'attribut row du second index - qui est devenu premier - reste à 1. Autrement dit :

  • Ajout d'un index : indexes.rows == [0]
  • Ajout d'un index : indexes.rows == [0, 1]
  • Suppression du deuxième index : indexes.rows == [0] (ça fonctionne)
  • Ajout d'un index : indexes.rows == [0, 1]
  • Suppression du premier index : indexes.rows == [1] (au lieu de [0])
  • Suppression de l'index restant : impossible car index.row() == 1, alors qu'il n'y a qu'un index dans le modèle

Le dépôt est ici et s'organise ainsi :

  • controllers :
    • tree_editor.py : envoie le signal à l'appui du bouton
    • tree_options.py : relaie le signal vers main_window.py
    • tree_view.py : envoie le signal lors d'un changement d'item courant
    • main_window.py : reçoit le signal de tree_view.py et stocke l'index courant dans un attribut. Puis, elle reçoit le signal de tree_options.py, lit la valeur de l'index courant et demande au modèle de le supprimer via removeIndex
  • models :
    • node.py : représente un item dans l'arbre
    • tree_model.py : hérite de QAbstractItemModel

Merci !

Édité par Vayel

+0 -0
Auteur du sujet

Il semble y avoir une erreur :

La fonction changeCurrentItem de MainWindow - ligne 121 - est exécutée lors de l'appel à beginRemoveRows dans la fonction removeRows de mon TreeModel. Sauf que la position n'est pas mise à jour. Du coup, je stocke dans l'attribut _currentIndex de la MainWindow un mauvais index.

Ce qui est étrange, c'est qu'avec cette fonction deleteCurrentItem dans ma MainWindow, j'obtiens deux valeurs différentes - alors que j'ai simplement cliqué de nouveau sur "Supprimer" depuis la dernière suppression.

1
2
3
4
def deleteCurrentItem(self):
    print(self._currentIndex.row()) # 1
    print(self._treeView.uiTreeView.currentIndex().row()) # 0
    self._model.removeIndex(self._currentIndex) 

Comment se fait-il que self._currentIndex.row() soit différent de self._treeView.uiTreeView.currentIndex().row() alors que je n'ai pas changé la sélection ?

Merci. =)

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte