QTableWidget 作为 QTreeView 中的子级

Posted

技术标签:

【中文标题】QTableWidget 作为 QTreeView 中的子级【英文标题】:QTableWidget as child in QTreeView 【发布时间】:2015-01-10 19:19:19 【问题描述】:

我有一个 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)

我想更改此设置,以便将 subData 填充到 QTableWidget 中,该 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 失败了。非常感谢任何有关如何进行此操作的指导(或如果可能!)或具体建议。

【问题讨论】:

【参考方案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)

【讨论】:

谢谢 - 仍然无法正常工作。我之所以有这样的原因是由于 PySide 文档的以下形式:如果将索引小部件 A 替换为索引小部件 B,则索引小部件 A 将被删除。例如,在下面的代码 sn-p 中,PySide.QtGui.QLineEdit 对象将被删除。 setIndexWidget(index, QLineEdit()) ... setIndexWidget(index, QTextEdit()) @lorgan。我看不出这有什么关系。关键是addItems 总是返回None,我的回答解决了这个问题。但是您的示例可能还有其他问题。首先,widgetDict 的目的是什么?你有参考吗?如果没有,您将必须确保所有索引小部件都被赋予父级,否则它们只会被垃圾收集(我已经稍微更新了我的答案以处理这个问题)。 我试图从 PySide 文档中使用 widgetDict 解决上述问题......所以我猜它什么也没做。将父级添加到小部件实例化中会将小部件添加到 treeView 的左上角 - setIndexWidget 命令仍然什么都不做 @lorgan。这可能表明您传递给setIndexWidget 的模型索引无效。 (再想一想,我之前关于需要为小部件提供父级的建议是错误的,因为视图将拥有小部件的所有权)。 所以这行有问题:modelIndex = self._proxyModel.mapToSource(self._proxyModel.index(i, 5 + j))? modelIndex type = and model = ...看起来有效?【参考方案2】:

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

改变这个:

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

到这里:

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

解决了问题

【讨论】:

以上是关于QTableWidget 作为 QTreeView 中的子级的主要内容,如果未能解决你的问题,请参考以下文章

如何根据作为输入的列表正确排序 QTreeView 中的列

如何将 QTableWidget 添加到 QTreeWidget 但作为 QTreeWidgetItem

QTableWidget 并生成英文数字作为数字行

如何将 QTableWidget 作为函数的参数传递

以编程方式检查QAbstractItemModel / QTreeView中的项目

QTableWidget 设置标题标签