如何使QtreeView和TreeModel同步

时间:2017-09-29 11:36:04

标签: python pyqt qtreeview qmodelindex

我正在使用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生成的(模型不起作用)。如何将视图中的选择连接到模型,以便我有正确的Modelindex并可以更改模型中的数据? 当然,如何写回来他们会同步?换句话说,我需要哪个指数来源于何处,何处以及从何而来?

1 个答案:

答案 0 :(得分:0)

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

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

信息来自here。 这些将返回一个QModelIndex列表,其中包含api。 (请注意,尽管本网站上有代码示例,但它仍然是C ++中的,但它应该仍然可读)

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

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

例如:

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

然后只需修改索引。

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

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

然后通过setData funtion修改值

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