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)
结果:

仅仅因为我最近需要 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)