QTreeWidget镜像python字典

cha*_*ase 7 python qt pyqt qtreewidget

有没有办法使QTreeWidget镜像对内部数据结构(如字典)所做的更改?看起来他们会在api中创建这个功能,因为有很多程序可以与QTreeWidget来自多个GUI区域的s 进行交互,但是需要的主要目的QTreeWidget是在任何时间点显示数据结构.QtGui项目的文档对我来说并不是那么简单,因为它通常是指C文档,我不确定它是如何转移到python的.

基本上我想要的是将QTreeWidget节目制作成嵌套字典的最简单方式,其中顶级对应于键,子级别对应于值.此外,如果值是字典,请使用该级别中的键并为值创建子级别等.

这很容易吗?我还没有找到任何可以做这样的数据结构的简单镜像.

Pav*_*hov 17

这是一个简单的实现:

def fill_item(item, value):
  item.setExpanded(True)
  if type(value) is dict:
    for key, val in sorted(value.iteritems()):
      child = QTreeWidgetItem()
      child.setText(0, unicode(key))
      item.addChild(child)
      fill_item(child, val)
  elif type(value) is list:
    for val in value:
      child = QTreeWidgetItem()
      item.addChild(child)
      if type(val) is dict:      
        child.setText(0, '[dict]')
        fill_item(child, val)
      elif type(val) is list:
        child.setText(0, '[list]')
        fill_item(child, val)
      else:
        child.setText(0, unicode(val))              
      child.setExpanded(True)
  else:
    child = QTreeWidgetItem()
    child.setText(0, unicode(value))
    item.addChild(child)

def fill_widget(widget, value):
  widget.clear()
  fill_item(widget.invisibleRootItem(), value)
Run Code Online (Sandbox Code Playgroud)

我添加了列表支持,万一有人需要它.

用法:

d = { 'key1': 'value1', 
  'key2': 'value2',
  'key3': [1,2,3, { 1: 3, 7 : 9}],
  'key4': object(),
  'key5': { 'another key1' : 'another value1',
            'another key2' : 'another value2'} }

widget = QTreeWidget()
fill_widget(widget, d)
widget.show()
Run Code Online (Sandbox Code Playgroud)

结果:

截图


fra*_*ans 6

仅仅因为我最近需要 Python3 和 PyQt5 的这个实现,这里是给定示例的一个稍短(和完整)的端口:

from PyQt5.QtWidgets import  QApplication, QTreeWidget, QTreeWidgetItem

class ViewTree(QTreeWidget):
    def __init__(self, value):
        super().__init__()
        def fill_item(item, value):
            def new_item(parent, text, val=None):
                child = QTreeWidgetItem([text])
                fill_item(child, val)
                parent.addChild(child)
                child.setExpanded(True)
            if value is None: return
            elif isinstance(value, dict):
                for key, val in sorted(value.items()):
                    new_item(item, str(key), val)
            elif isinstance(value, (list, tuple)):
                for val in value:
                    text = (str(val) if not isinstance(val, (dict, list, tuple))
                            else '[%s]' % type(val).__name__)
                    new_item(item, text, val) 
            else:
                new_item(item, str(value))

        fill_item(self.invisibleRootItem(), value)

if __name__ == '__main__':
    app = QApplication([])
    window = ViewTree({ 'key1': 'value1', 'key3': [1,2,3, { 1: 3, 7 : 9}]})
    window.show()
    app.exec_()
Run Code Online (Sandbox Code Playgroud)