2017-09-29 3 views
0

J'utilise pyqt5 et python 3.6. Je suis confus au sujet des fonctions d'index dans QModel/TreeView et demande ici d'effacer mon noeud dans le cerveau. Certains threads me confondent plus parce qu'ils sont très spéciaux. Ma question est plus ou moins fondamentale.Comment QtreeView et TreeModel sont synchronisés

j'ai un modèle (basé sur Uludag's great tutorials) avec des données et positionniez à mon arbre: Maintenant, j'ai

treeView = QTreeView() 
treeView.show() 
treeView.setModel(model) 
#additional code 
treeView.clicked.connect(treeViewStructure_clicked) 

pour préparer d'autres mesures dans le programme en fonction de l'élément sélectionné. Je peux obtenir l'article par

def treeViewStructure_clicked(self): 
    #get the row of the click and print 
    index = treeView.currentIndex() 
    print(index.row()) 
    print('selected item index at %s with data: %s' % (index.row(), index.data())) 

Jusqu'ici tout va bien. Mais l'index est généré à partir de treeView (le modèle ne fonctionne pas). Comment puis-je connecter le formulaire de sélection de la vue au modèle, de sorte que j'ai le Modelindex correct et que je puisse modifier les données dans le modèle? Et bien sûr, comment les réécrire qu'ils seront synchronisés? En d'autres termes, de quel indice ai-je besoin pour quoi et où et d'où viennent-ils?

+0

L'arbre juste délégués à tout ce modèle est a. Donc, les index viennent toujours du modèle. – ekhumoro

+0

Merci! Cela signifie par exemple Si vous cliquez sur un élément dans l'arborescence, l'index du modèle est défini. Donc je dois avoir un autre problème .. – Hans

Répondre

0

J'aimerais laisser un commentaire mais je n'ai pas assez de réputation.

Étant donné que votre implémentation du modèle n'incluait pas de méthode capable de renvoyer l'index sélectionné, je dois l'obtenir de pyqt5. Depuis treeView est un QTreeView, vous pouvez: treeView.selectionModel().selectedIndexes()

l'information est de here. Cela retournera une liste QModelIndex, qui a un api ici. (Notez que bien qu'il existe des exemples de code sur ce site, il est en C++, mais il devrait toujours être lisible)

Dans l'API, vous pouvez obtenir la ligne et la colonne ainsi que le parent de l'objet QModelIndex.

Normalement, je modifierais simplement les données via l'objet retourné par treeView.selectionModel(). SelectedIndexes().

par exemple:

arr = treeView.selectionModel().selectedIndexes() 
index = arr[0] 

puis il suffit de modifier l'index. Mais si vous DEVEZ utiliser votre propre modèle pour quelque raison que ce soit, il y a une chose que vous pouvez faire. Puisqu'il étend QAbstractItemModel, vous pouvez utiliser la fonction d'index. Par exemple:

arr = treeView.selectionModel().selectedIndexes() 
indexTemp = arr[0] 
index = model.index(indexTemp.row(), indexTemp.column(), indexTemp.parent()) 

modifier la valeur par setData funtion

Mais comme vous pouvez le voir, il y a une étape supplémentaire pour obtenir le même objet