【问题标题】:Multi-Level QTreeView using dictionaries使用字典的多级 QTreeView
【发布时间】:2019-07-21 04:47:30
【问题描述】:

我正在尝试在 QTreeView 中使用字典来创建多级视图,我发现一个帖子的工作方式与我想要的几乎相同,但我不希望文本显示在“值”列上对于每个级别/子级别。并删除具有该值的项目下的额外行。关于如何实现这一点的任何提示?

PySide: QTreeView to nested dictionary

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_())

期望的结果:

【问题讨论】:

    标签: python python-3.x dictionary pyqt5 qtreeview


    【解决方案1】:

    您的结构不同,因此其他方法不起作用,在您的情况下,只有第一列被填充,除非它不是字典,因为在这种情况下,第二列被重新填充:

    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])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-10
      • 2022-01-25
      • 1970-01-01
      • 2013-12-30
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多