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

问题描述:

我需要根据请求创建一个QTreeView。PyQT和QTreeView:当用户点击一个项目时需要询问儿童

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

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

真的很简单。

首先,将树的expanded信号连接到处理程序,并使用根的*项目填充树。

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

如果该项目已经有孩子,什么也不做;否则,填充任何适合该项目的*项目。

UPDATE

下面是一个脚本演示了如何动态地构建树。

为简单起见,该演示使用QTreeWidget,从而避免需要单独的模型。其他数据通过使用QTreeWidgetItem.setData存储在树中。

请注意,导入顶端的sip仅用于Python 2和Python 3之间的兼容性(有关详细信息,请参见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_()) 
+0

感谢您的回复。我理解我必须将信号连接到处理程序的部分,但不能用hasChildren方法完成。当展开的方法被触发时,我是否应该再次检查该项目是否有孩子,然后将它们添加到模型中?还是应该以另一种方式创建模型? – estemendoza 2012-01-11 21:07:59

+0

@estemendoza。什么是用来填充树的数据,它来自哪里? – ekhumoro 2012-01-11 21:17:50

+0

数据来自web服务,在给定项目(父)的情况下,它会以该项目的子项作为响应。请耐心等待,因为我是PyQT和QT本身的新手。希望这可以帮助。 – estemendoza 2012-01-13 01:05:20