使用字典的多级 QTreeView
Multi-Level QTreeView using dictionaries
我正在尝试使用 QTreeView 中的字典来创建多级视图,我发现 post 的工作方式几乎与我想要的一样,但我不希望显示文本在每个 level/sublevel 的 'value' 列上。并且还删除具有值的项目下的额外行。关于如何实现这个的任何提示?
from PyQt5 import QtGui,QtCore,QtWidgets
import sys
class MainFrame(QtWidgets.QWidget):
def __init__(self):
QtWidgets.QWidget.__init__(self)
tree = {'RootLevel':{
"Level1": {"Level1_item1":14, "Level1_item2":12, "Level1_item3":3.55},
"Level2": {
"Level2_SubLevel1": {"Level2_SubLevel1_item1":3.52, "Level2_SubLevel1_item2":2.55, "Level2_SubLevel1_item3":13},
"Level2_SubLevel2": {"Level2_SubLevel2_item1":2, "Level2_SubLevel2_item2":4, "Level2_SubLevel2_item3":3.11}
},
"Level3": {"Level3_item1":12, "Level3_item2":13.55, "Level3_item3":122}}
}
self.tree = QtWidgets.QTreeView(self)
layout = QtWidgets.QHBoxLayout(self)
layout.addWidget(self.tree)
root_model = QtGui.QStandardItemModel()
self.tree.setModel(root_model)
self.tree.model().setHorizontalHeaderLabels(['Level','Values'])
self.fill_model_from_json(root_model.invisibleRootItem(), tree)
def fill_model_from_json(self,parent, d):
if isinstance(d, dict):
for k, v in d.items():
child = QtGui.QStandardItem(str(k))
value = QtGui.QStandardItem(str(v))
parent.appendRow([child,value])
self.fill_model_from_json(child, v)
elif isinstance(d, list):
for v in d.items():
self.fill_model_from_json(parent, v)
else:
parent.appendRow(QtGui.QStandardItem(str(d)))
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
main = MainFrame()
main.show()
sys.exit(app.exec_())
期望的结果:
您的结构不同,所以其他方法不起作用,在您的情况下,只有第一列被填充,除非它不是字典,因为在那种情况下,第二列被重新填充:
def fill_model_from_json(self, parent, d):
if isinstance(d, dict):
for key, value in d.items():
it = QtGui.QStandardItem(str(key))
if isinstance(value, dict):
parent.appendRow(it)
self.fill_model_from_json(it, value)
else:
it2 = QtGui.QStandardItem(str(value))
parent.appendRow([it, it2])
我正在尝试使用 QTreeView 中的字典来创建多级视图,我发现 post 的工作方式几乎与我想要的一样,但我不希望显示文本在每个 level/sublevel 的 'value' 列上。并且还删除具有值的项目下的额外行。关于如何实现这个的任何提示?
from PyQt5 import QtGui,QtCore,QtWidgets
import sys
class MainFrame(QtWidgets.QWidget):
def __init__(self):
QtWidgets.QWidget.__init__(self)
tree = {'RootLevel':{
"Level1": {"Level1_item1":14, "Level1_item2":12, "Level1_item3":3.55},
"Level2": {
"Level2_SubLevel1": {"Level2_SubLevel1_item1":3.52, "Level2_SubLevel1_item2":2.55, "Level2_SubLevel1_item3":13},
"Level2_SubLevel2": {"Level2_SubLevel2_item1":2, "Level2_SubLevel2_item2":4, "Level2_SubLevel2_item3":3.11}
},
"Level3": {"Level3_item1":12, "Level3_item2":13.55, "Level3_item3":122}}
}
self.tree = QtWidgets.QTreeView(self)
layout = QtWidgets.QHBoxLayout(self)
layout.addWidget(self.tree)
root_model = QtGui.QStandardItemModel()
self.tree.setModel(root_model)
self.tree.model().setHorizontalHeaderLabels(['Level','Values'])
self.fill_model_from_json(root_model.invisibleRootItem(), tree)
def fill_model_from_json(self,parent, d):
if isinstance(d, dict):
for k, v in d.items():
child = QtGui.QStandardItem(str(k))
value = QtGui.QStandardItem(str(v))
parent.appendRow([child,value])
self.fill_model_from_json(child, v)
elif isinstance(d, list):
for v in d.items():
self.fill_model_from_json(parent, v)
else:
parent.appendRow(QtGui.QStandardItem(str(d)))
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
main = MainFrame()
main.show()
sys.exit(app.exec_())
期望的结果:
您的结构不同,所以其他方法不起作用,在您的情况下,只有第一列被填充,除非它不是字典,因为在那种情况下,第二列被重新填充:
def fill_model_from_json(self, parent, d):
if isinstance(d, dict):
for key, value in d.items():
it = QtGui.QStandardItem(str(key))
if isinstance(value, dict):
parent.appendRow(it)
self.fill_model_from_json(it, value)
else:
it2 = QtGui.QStandardItem(str(value))
parent.appendRow([it, it2])