在qtreewidget中使用自定义小部件的python/pyside

问题描述:

使用Python3和pyside。 我有一个Python字典,我想要显示为使用Qt的树。我想要的值是可编辑的,但不是关键。我已成功地实现这一目标使用setItemWidget如下面的例子:在qtreewidget中使用自定义小部件的python/pyside

#!/usr/bin/python3 
# -*- coding: utf-8 -*- 

import sys 
from PySide import QtGui 

def data_to_tree(parent, data): 
    if isinstance(data, dict): 
     parent.setFirstColumnSpanned(True) 
     for key,value in data.items(): 
      child = QtGui.QTreeWidgetItem(parent) 
      child.setText(0, key) 
      data_to_tree(child, value) 
    elif isinstance(data, list): 
     parent.setFirstColumnSpanned(True) 
     for index,value in enumerate(data): 
      child = QtGui.QTreeWidgetItem(parent) 
      child.setText(0, str(index)) 
      data_to_tree(child, value) 
    else: 
     widget = QtGui.QLineEdit(parent.treeWidget()) 
     widget.setText(str(data)) 
     parent.treeWidget().setItemWidget(parent, 1, widget) 

app = QtGui.QApplication(sys.argv) 

wid = QtGui.QTreeWidget() 
wid.setColumnCount(2) 
wid.show() 

data = { 
    'foo':'bar', 
    'bar': ['f', 'o', 'o'], 
    'foobar':0, 
} 
data_to_tree(wid.invisibleRootItem(), data) 

sys.exit(app.exec_()) 

这工作,但它违背了文档建议(静态内容)是什么,并使其无法事先创建的窗口小部件(在一个单独的线程为例),然后将其添加到树中。有没有更好的方法来实现我想要的?文档提到QTreeView,但我还没有找到任何示例/教程让我明白它将如何帮助我在列中使用自己的小部件。

有你可能要考虑两个选项:

  • 您可以创建自己的类,这是一个QTreeWidget的子类。这很简单,因为你只是简单地使用你现有的方法并把它放在课堂上。但是这并没有真正改变很多,除了在你的自定义小部件上调用它时看起来更“自然”。

  • 另一种方法,这就是您谈论文档时最可能引用的模型/视图体系结构。

在这种情况下,你将不得不使用QTreeView并创建自己的QTreeModel。在这里,视图完全不知道数据是什么,模型负责提供所有数据,并在视图准备好显示时通知视图。因此,当数据准备好/更改时,必须创建该对象并发出信号,以便更新视图。

想了解如何实现类似的东西,你可以看一下PySide提供的例子。很可能你已经安装了它们,请查看site-packages/PySide/examples/itemviews/simpletreemodel

此外,请考虑查看indexWidget方法,以便您可以在需要时添加您的QEditLine,并将默认值调用父级。