获取QTreeView中当前选定的项

7 投票
2 回答
27284 浏览
提问于 2025-04-16 23:30

我在一个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 个回答

2

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

不过,下面的代码对我有用,可以获取选中行的第0列数据:

dbQueryModel.itemData(treeView.selectedIndexes()[0])
9

你调用的函数是对的,它实际上返回的是一个 QModelIndexList,这个东西其实就是 QList<QModelIndex> 的一种别名。QModelIndex 是一种数据结构,可以指向树形结构中的任何部分。需要注意的是,QModelIndex 不是模型(Model),在模型-视图-控制器(MVC)这个概念里,它只是 QAbstractItemModel 中某个对象的地址,而 QAbstractItemModel 是 Qt 所有 ItemView 对象(包括你的树形结构)底层使用的数据结构。你其实已经很接近了,QAbstractModelIndex 包含了一行、一列和一个父级,这样就能定位到层级数据结构中的任何位置。如果你使用下面这行代码

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

你应该能找到你想要的对象。

至于文档,虽然没有专门针对 Python 的文档,但阅读官方的 Qt 文档还是很有帮助的,因为类的层级和功能是一样的。文档中关于 C++ 的信息其实也很少。

撰写回答