2011-08-12 12 views
5

QTreeViewには多数のアイテムがあります。各項目は、このクラスを使用して生成されます。QTreeViewで現在選択されているアイテムを取得する

class Branch(QStandardItem): 
    def __init__(self, label, uri = None): 
     QStandardItem.__init__(self, label) 
     self.uri = uri 

これは私の実際の木である:

class FileTree(QTreeView): 
    def __init__(self): 
     QTreeView.__init__(self) 
    def keyPressEvent(self, event): 
     if event.key() == Qt.Key_Space or event.key() == Qt.Key_Return: 
      crawler = self.selectedIndexes()[0].model().item(self.selectedIndexes()[0].row()) 
      print(crawler.uri) 
     QTreeView.keyPressEvent(self, event) 

あなたが見ることができるように、私が選択したからURI変数を取得する方法のように少しわかりませんよ項目。私はselectedIndexes()が商品そのものではなくモデルを返すことを発見しました。私はどのように1つから他のものに取得するか分からない。 self.selectedIndexes()[0].row()を使ってアイテム番号を取得しようとすると、暗闇の中でちょっとしたショットがありましたが、ツリー内のさまざまなブランチを無視しているようです(たとえば、ブランチの最初の行には0、それがどこにあるかについて私に教えてください)。

QTreeViewから選択したアイテムを取得する適切な方法は何ですか?または、これを簡単にするために、スペースバーまたはリターンキーが検出されるより良い方法がありますか? QtのためのPythonドキュメントの深刻な欠如があります。だから、私が今まで知的なやり方でやっていることを知ることは本当に難しいです。あなたは右の関数を呼び出している

答えて

5

は、それが実際にQModelIndexは、ツリーの任意の一部を指すことができるデータ構造であることとQList<QModelIndex>のためだけのtypedefであるQModelIndexListを返します。 QModelIndexはModel View Controller(MVC)の意味でのモデルではなく、ツリーを含むQtのすべてのItemViewオブジェクトの下のデータ構造であるQAbstractItemModelのオブジェクトのアドレスです。あなたは実際にはかなり近いです。QAbstractModelIndexは、行、列、および親で構成されており、階層データ構造内の任意の位置にアドレスすることができます。行を使用している場合

index = self.selectedIndexes()[0] 
crawler = index.model().itemFromIndex(index) 

あなたが探しているオブジェクトに到達する必要があります。

ドキュメンテーションに関しては、公式のQtドキュメントを読むのに役立つPython固有のドキュメントはありませんが、クラス階層と機能は同じです。ドキュメントにはC++固有の情報はほとんどありません。

+0

恐ろしい - それは私が探していたまさにです。これは私がQtでやった最初のことです。それを説明する時間をとってくれてありがとう。 – ashground

0

私はモデルとしてQSqlQueryModelを使用しているため、Haraldの答えは私のためには機能しませんでした(エラー{AttributeError}'QSqlQueryModel' object has no attribute 'itemFromIndex'があります)。

以下、選択された行の0番目の列データを取得するために、しかし私のためのトリックをした:

dbQueryModel.itemData(treeView.selectedIndexes()[0]) 
関連する問題