【问题标题】:Getting the currently selected item in QTreeView获取 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 文档严重缺乏,所以真的很难知道我是否曾经以一种有意义的方式做事。

【问题讨论】:

    标签: python qt


    【解决方案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])
    

    【讨论】:

      猜你喜欢
      • 2018-05-17
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多