我需要根据请求创建一个 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_())