2017-09-29 11 views
0

私はpyqt5とpython 3.6を使用しています。 私はQModel/TreeViewのインデックス関数について混乱しており、ここで脳の結び目をクリアするように頼んでいます。いくつかのスレッドは非常に特別なので、私をもっと混乱させました。私の質問は多かれ少なかれ基本的なものです。QtreeViewとTreeModelの同期方法

私はデータを持つ(Uludag's great tutorialsに基づく)のモデルを持っているし、私のツリーに設定しました:

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

今、私が選択した項目に基づいて、プログラムの更なる行動を準備する必要があります。私はアイテムを得ることができます

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())) 

これまでのところ良いです。しかし、このインデックスはtreeViewから生成されます(モデルは機能しません)。どのようにして選択フォームをモデルに接続して、正しいModelindexを持ち、モデル内のデータを変更できるのでしょうか? もちろん、それらを書き直して同期させる方法はありますか?言い換えれば、どこから来て、どこから来るのであれば、どのインデックスが必要ですか?

+0

に持っているものは何でもモデルであるだけで、デリゲートにツリーを取得するために余分なステップです。したがって、インデックスは常にモデルから来ます。 – ekhumoro

+0

ありがとう!これは、例えばを意味する。ツリー内の項目をクリックすると、モデル内のインデックスが設定されます。だから別の問題があるはずです。 – Hans

答えて

0

私はコメントを残したいが、私は十分な評判がない。

モデルの実装に、選択したインデックスを返すメソッドが含まれていないため、pyqt5から取得する必要があります。ツリービューはQTreeViewなので、次のことができます。からの情報は、 treeView.selectionModel().selectedIndexes()

です。 これらはQModelIndexリストを返します。ここにはapiが含まれています。 (このWebサイトにはコード例がありますが、それはC++ですが、それでも読み込み可能です)

apiでは、QModelIndexオブジェクトから行と列、および親を取得できます。

通常、私はtreeView.selectionModel()。selectedIndexes()によって返されたオブジェクトを介してデータを変更します。例えば

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

そしてちょうどインデックスを変更します。

しかし、何らかの理由で自分のモデルを使用する必要がある場合は、できることが1つあります。 QAbstractItemModelを拡張しているため、インデックス関数を使用できます。たとえば :

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

が、その後のsetData目的球

て値を変更しかし、あなたが見ることができるように、それは同じオブジェクト

関連する問題