QTreeWidget作为QTreeView中的子项

时间:2015-01-10 19:19:20

标签: python qt pyqt4 qtreeview

我有一个QTreeView,它通过QSortFilterProxyModel从QAbstractItemModel填充。

我已经实现了一个DataStructure类,它为数据和TreeView(QAbstractItemModel)类设置父/子关系 - 这很好用,并按我的意愿填充QTreeView。

treeView设置如下:

from PyQt4 import QtCore, QtGui
import data_Model

#DataStructure(data, parent=None)
rootNode = data_Model.DataStructure('_Holder')

for i in mainData:
    mainRow = data_Model.DataStructure(i, rootNode)
    for j in subData:
        data_Model.DataStructure(j, mainRow)

self._proxyModel = QtGui.QSortFilterProxyModel()
self._model = data_Model.TreeModel(rootNode)
self._proxyModel.setSourceModel(self._model)

self.treeView.setModel(self._proxyModel)

我想更改此设置,以便在QTableWidget中填充subData,该QTableWidget是特定列索引的相关mainRow的子项

我的尝试是删除:

    for j in subData:
        data_Model.DataStructure(j, mainRow)

从上面开始,每次设置主模型时调用以下内容:

def addChild(self, subData):

    rowCount = self._proxyModel.rowCount()
    widgetDict = {}

    for i in range(rowCount):

        for j in range(len(subData)):

            #set model index as current row and column 5 onwards
            modelIndex = self._proxyModel.mapToSource(self._proxyModel.index(i, 5 + j))
            widgetDict[str(i) + str(j)] = QtGui.QListWidget().addItems(subData[j])

            self.treeView.setIndexWidget(modelIndex, widgetDict[str(i) + str(j)])

setIndexWidget调用似乎没有任何效果。我确信这是一个完全落后的方法,但是我在data_Model中包含QListWidget的尝试失败了。任何关于如何(或者如果可能!)或具体建议的指示都非常感激。

2 个答案:

答案 0 :(得分:1)

不确定代码的其余部分,但行:

    widgetDict[str(i) + str(j)] = QtGui.QListWidget().addItems(subData[j])

将创建并填充列表窗口小部件,然后将其丢弃并将None添加到widgetDict

你可能想要更像的东西:

    widget = QtGui.QListWidget()
    widget.addItems(subData[j])
    widgetDict[str(i) + str(j)] = widget
    self.treeView.setIndexWidget(modelIndex, widget)

答案 1 :(得分:0)

正如@ekhumoro指出的modelIndex.model()和treeView.model()需要相同。我试图将_proxyModel映射回_model,这就是问题

更改此内容:

modelIndex = self._proxyModel.mapToSource(self._proxyModel.index(i, 5 + j))

到此:

modelIndex = self._proxyModel.index(i, 5 + j))

解决了问题