2011-08-12 54 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()返回一个模型,而不是项目本身。我不知道如何从一个到另一个。尝试使用self.selectedIndexes()[0].row()获得物品编号在黑暗中有一些镜头,但它似乎忽略了树中的各个分支(例如,它会给我一个0作为分支中的第一行,但赢得了'不要告诉我任何有关它的分支)。

从QTreeView中获取所选项目的正确方法是什么?还是有更好的方法来检测空格键或返回键被击中,这将使这更容易? Qt严重缺乏Python文档,因此很难知道我是否以一种合理的方式做事。

回答

5

要调用正确的函数,它实际上返回QModelIndexList这仅仅是一个与QModelIndex是数据结构可以指向树的任何一部分QList<QModelIndex>的typedef。 QModelIndex不是模型视图控制器(MVC)意义上的模型,而是QAbstractItemModel中对象的地址,它是Qt的所有ItemView对象(包括您的树)下的数据结构。你实际上非常接近,QAbstractModelIndex由一个行,一个列和一个父项组成,它可以让它在分层数据结构中的任何位置。如果您使用该行

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

您应该找到您要查找的对象。

至于文档,尽管没有python特定的文档可以帮助阅读官方的Qt文档,但是类层次和功能仍然是一样的。文档中只有很少的C++特定信息。

+0

真棒 - 这正是我一直在寻找。这是我在Qt中做过的第一件事。感谢您花时间解释它。 – ashground

0

Harald的回答对我不起作用,因为我使用的是QSqlQueryModel作为模型(我得到了错误{AttributeError}'QSqlQueryModel' object has no attribute 'itemFromIndex')。

以下的伎俩对我来说,虽然,获取所选行的第0列数据:

dbQueryModel.itemData(treeView.selectedIndexes()[0]) 
相关问题