获取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文档非常缺乏,所以我真的很难知道自己做的事情是否合理。
2 个回答
Harald的回答对我没用,因为我用的是QSqlQueryModel作为模型(我遇到了错误{AttributeError}'QSqlQueryModel' object has no attribute 'itemFromIndex'
)。
不过,下面的代码对我有用,可以获取选中行的第0列数据:
dbQueryModel.itemData(treeView.selectedIndexes()[0])
你调用的函数是对的,它实际上返回的是一个 QModelIndexList
,这个东西其实就是 QList<QModelIndex>
的一种别名。QModelIndex
是一种数据结构,可以指向树形结构中的任何部分。需要注意的是,QModelIndex
不是模型(Model),在模型-视图-控制器(MVC)这个概念里,它只是 QAbstractItemModel
中某个对象的地址,而 QAbstractItemModel
是 Qt 所有 ItemView 对象(包括你的树形结构)底层使用的数据结构。你其实已经很接近了,QAbstractModelIndex
包含了一行、一列和一个父级,这样就能定位到层级数据结构中的任何位置。如果你使用下面这行代码
index = self.selectedIndexes()[0]
crawler = index.model().itemFromIndex(index)
你应该能找到你想要的对象。
至于文档,虽然没有专门针对 Python 的文档,但阅读官方的 Qt 文档还是很有帮助的,因为类的层级和功能是一样的。文档中关于 C++ 的信息其实也很少。