获取 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 中当前选中的项目的主要内容,如果未能解决你的问题,请参考以下文章