1

Python3 と pyside を使用します。Qtを使用してツリーとして表示したいPython辞書があります。キーではなく、値を編集可能にしたい。次の例に示すように、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 が記載されていますが、列で独自のウィジェットを使用するのにどのように役立つかを理解できる例/チュートリアルは見つかりませんでした。

4

1 に答える 1

2

考慮すべきオプションが 2 つあります。

  • のサブクラスである独自のクラスを作成できますQTreeWidget。メソッドをそのまま使用してクラス内に配置するだけなので、これは簡単です。ただし、カスタム ウィジェットでこれを呼び出すと、より「自然」に見えるという事実を除いて、これは実際にはあまり変わりません。

  • もう 1 つの方法は、ドキュメントについて話すときにおそらく参照しているものであり、モデル/ビュー アーキテクチャです。

その場合、 を使用しQTreeViewて独自の を作成する必要がありますQTreeModel。ここでは、ビューはデータが何であるかをまったく認識しておらず、モデルはすべてのデータを提供し、表示する準備ができたときにビューに通知する責任があります。したがって、ビューが更新されるように、そのオブジェクトを作成し、データの準備ができた/変更されたときに信号を送信する必要があります。

同様のものを実装する方法については、PySide で提供されている例を参照してください。ほとんどの場合、それらがインストールされています。 を参照してくださいsite-packages/PySide/examples/itemviews/simpletreemodel

また、indexWidgetQEditLineメソッドを調べて、必要な場所に追加し、デフォルトの親を呼び出すことができるようにすることを検討してください。

于 2013-03-02T20:30:46.367 に答える