获取 QTreeView 中当前选中的项目

Posted

技术标签:

【中文标题】获取 QTreeView 中当前选中的项目【英文标题】:Getting the currently selected item in QTreeView 【发布时间】:2011-08-12 23:55:41 【问题描述】:

我在 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 文档严重缺乏,所以真的很难知道我是否曾经以一种有意义的方式做事。

【问题讨论】:

【参考方案1】:

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

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

您应该找到您正在寻找的对象。

至于文档,尽管没有特定于 python 的文档,但通读 Qt 官方文档会有所帮助,类层次结构和功能仍然相同。文档中的 C++ 特定信息非常少。

【讨论】:

太棒了——这正是我想要的。这是我在 Qt 中做过的第一件事。感谢您花时间解释它。【参考方案2】:

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

下面为我做了诀窍,获取所选行的第 0 列数据:

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

【讨论】:

以上是关于获取 QTreeView 中当前选中的项目的主要内容,如果未能解决你的问题,请参考以下文章

在 PySide 的 QTreeView 中更改时如何获取项目的先前名称

QTreeView 的两个嵌套代理模型和段错误

C#中按钮点击后,treeview控件怎么选中指定节点?

如何从 qtreeview 中的父行中获取特定列

C# treeview 获得选中值

从 JComboBox 弹出窗口中获取当前突出显示的项目(未选中的项目)