1

リクエストに基づいてQTreeViewを作成する必要があります。

したがって、ユーザーがアプリケーションを開くと、ツリーのルートアイテムを取得するように要求する必要があります。ユーザーがそのアイテムをクリックすると、子を要求する必要があります。

希望どおりのリクエストで実用的な例を見つけることができず、これが可能かどうかさえわかりません。

4

1 に答える 1

3

とても簡単です。

まず、ツリーの展開されたシグナルをハンドラーに接続し、ツリーにルートの最上位アイテムを入力します。

シグナルが発生すると、展開されたアイテムのインデックスがハンドラーに渡されます。次に、ハンドラーはこれを使用して、たとえばモデルの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_())
于 2012-01-11T19:14:40.213 に答える