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

2024-10-01 11:36:39 发布

您现在位置:Python中文网/ 问答频道 /正文

使用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,但是我还没有找到任何可以让我理解它如何帮助我在专栏中使用自己的小部件的示例/教程。在


Tags: toimportchildtreedatavaluesyswidget
1条回答
网友
1楼 · 发布于 2024-10-01 11:36:39

您可能需要考虑两个选项:

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

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

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

要了解如何实现类似的功能,可以查看PySide提供的示例。很可能您已经安装了它们,请查看site-packages/PySide/examples/itemviews/simpletreemodel。在

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

相关问题 更多 >