使用Python3和pyside。 我有一个python字典,我想用Qt显示为树。我希望值可编辑但不是键。我已设法使用setItemWidget实现此目的,如以下示例所示:
#!/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但我没有找到任何示例/教程让我了解它如何帮助我在列中使用我自己的小部件。
答案 0 :(得分:2)
您可能需要考虑两个选项:
您可以创建自己的类,它是QTreeWidget
的子类。这很简单,因为您只需使用您拥有的方法并将其放入类中。但这并没有真正改变很多,除了它看起来更多"自然"在您的自定义小部件上调用它时。
另一种方法是在谈论文档时最常引用的方法是模型/视图架构。
在这种情况下,您必须使用QTreeView
并创建自己的QTreeModel
。在这里,视图完全不知道数据是什么,模型负责提供所有数据,并在视图准备好显示时通知视图。因此,当数据准备好/发生更改时,您必须创建该对象并发出信号,以便更新视图。
有关如何实现类似功能的想法,您可以查看PySide提供的示例。很可能是你安装了它们,查看site-packages/PySide/examples/itemviews/simpletreemodel
。
另外,请考虑查看indexWidget方法,以便在需要的地方添加QEditLine
,并将父级调用为默认值。