PyQT和QTreeView:用户点击某个项目时需要询问儿童

时间:2012-01-11 18:42:45

标签: request pyqt qtreeview

我需要根据请求创建一个QTreeView。

因此,当用户打开应用程序时,它应该请求获取树的根项。一旦用户点击该项目,它应该要求孩子,等等。

我无法找到任何有关请求的工作示例,我甚至不知道这是否可行。

1 个答案:

答案 0 :(得分:3)

真的很简单。

首先,将树的expanded信号连接到处理程序,然后使用根的顶级项填充树。

当触发信号时,它会将展开项的索引传递给处理程序。然后,处理程序可以使用它来检查项目是否有任何子项,例如模型的hasChildren方法。

如果该项目已有孩子,则什么都不做;否则,请使用适合该项目的任何顶级项目填充它。

<强>更新

下面的脚本演示了如何动态构建树。

为简单起见,演示使用QTreeWidget,因此无需单独的模型。使用QTreeWidgetItem.setData将其他数据存储在树中。

请注意,只有Python 2和3之间的兼容性才需要顶部的sip导入(有关详细信息,请参阅here)。如果您使用的是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_())