2012-01-11 60 views

回答

3

真的很簡單。

首先,將樹的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

相關問題