0

我正在使用 pyqt5 和 python 3.6。我对 QModel/TreeView 中的索引函数感到困惑,并要求在这里清除我的大脑结。有些线程更让我困惑,因为它们非常特别。我的问题或多或少是一个基本问题。

我有一个带有数据的模型(基于Uludag's great tutorials)并将其设置到我的树中:

treeView = QTreeView()
treeView.show()
treeView.setModel(model)
#additional code
treeView.clicked.connect(treeViewStructure_clicked)

现在我必须根据所选项目在程序中准备进一步的操作。我可以通过

def treeViewStructure_clicked(self):
    #get the row of the click and print
    index = treeView.currentIndex()
    print(index.row())
    print('selected item index at %s with data: %s' % (index.row(), index.data()))

到目前为止,一切都很好。但是索引是从 treeView 生成的(模型不起作用)。如何将视图中的选择连接到模型,以便我拥有正确的模型索引并可以更改模型中的数据?当然,如何将它们写回以使它们同步?换句话说,我需要哪个索引来说明它们来自什么、来自哪里以及来自哪里?

4

1 回答 1

0

我很想发表评论,但我没有足够的声誉。

由于您的模型实现不包含可以返回所选索引的方法,因此我必须从 pyqt5.x 中获取它。由于 treeView 是 QTreeView,您可以: treeView.selectionModel().selectedIndexes()

信息来自这里。这些将返回一个 QModelIndex 列表,这里有一个api。(请注意,虽然本网站上有代码示例,但它是用 C++ 编写的,但应该仍然可读)

在 api 中,您可以从 QModelIndex 对象中获取行和列以及父对象。

通常,我只是通过 treeView.selectionModel().selectedIndexes() 返回的对象来修改数据。

例如:

arr = treeView.selectionModel().selectedIndexes()
index = arr[0]

然后只需修改索引。

但是,如果您出于某种原因必须使用自己的模型,那么您可以做一件事。由于它扩展了 QAbstractItemModel,因此您可以使用 index 函数。例如:

arr = treeView.selectionModel().selectedIndexes()
indexTemp = arr[0]
index = model.index(indexTemp.row(), indexTemp.column(), indexTemp.parent())

然后通过 setData 函数修改值

但是正如你所看到的,获得相同的对象是一个额外的步骤

于 2017-09-29T18:37:03.740 回答