リクエストに基づいてQTreeViewを作成する必要があります。
したがって、ユーザーがアプリケーションを開くと、ツリーのルートアイテムを取得するように要求する必要があります。ユーザーがそのアイテムをクリックすると、子を要求する必要があります。
希望どおりのリクエストで実用的な例を見つけることができず、これが可能かどうかさえわかりません。
とても簡単です。
まず、ツリーの展開されたシグナルをハンドラーに接続し、ツリーにルートの最上位アイテムを入力します。
シグナルが発生すると、展開されたアイテムのインデックスがハンドラーに渡されます。次に、ハンドラーはこれを使用して、たとえばモデルのhasChildrenメソッドを使用して、アイテムに子があるかどうかを確認できます。
アイテムにすでに子がある場合は、何もしません。それ以外の場合は、そのアイテムに適切なトップレベルのアイテムを入力します。
アップデート
以下は、ツリーを動的に構築する方法を示すスクリプトです。
簡単にするために、デモではQTreeWidgetを使用しているため、別のモデルは必要ありません。QTreeWidgetItem.setDataを使用して、追加のデータがツリー内に保存されます。
sip
上部のインポートは、Python 2と3の間の互換性のためにのみ必要であることに注意してください(詳細については、ここを参照してください)。Python 2を使用している場合は、必要ありません。
import sip
sip.setapi('QVariant', 1)
from PyQt4 import QtGui, QtCore
class Window(QtGui.QTreeWidget):
def __init__(self):
QtGui.QTreeWidget.__init__(self)
self.setHeaderHidden(True)
self.itemExpanded.connect(self.handleExpanded)
self.itemClicked.connect(self.handleClicked)
self.handleExpanded(self.invisibleRootItem())
def depth(self, item):
depth = 0
while item is not None:
item = item.parent()
depth += 1
return depth
def requestData(self):
for title in 'One Two Three Four Five'.split():
yield title, 'additional data'
def addItems(self, parent):
depth = self.depth(parent)
for title, data in self.requestData():
item = QtGui.QTreeWidgetItem(parent, [title])
item.setData(0, QtCore.Qt.UserRole, data)
if depth < 3:
item.setChildIndicatorPolicy(
QtGui.QTreeWidgetItem.ShowIndicator)
def handleExpanded(self, item):
if item is not None and not item.childCount():
self.addItems(item)
def handleClicked(self, item, column):
print(item.data(column, QtCore.Qt.UserRole).toPyObject())
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())