(PyQt) QTreeView - wollen erweitern/reduzieren-alle Kinder und Enkel

Ich möchte in der Lage sein zu erweitern oder zu reduzieren alle Kinder von einem bestimmten Zweig in einem QTreeView. Ich bin mit PyQt4.

Ich weiß, dass QTreeView haben eine erweitern für alle Kinder verfügen, die gebunden ist an *, aber ich brauche zwei Dinge: Es muss gebunden werden, um eine andere Tastenkombination (shift-space), und ich muss auch in der Lage sein, um den Zusammenbruch aller Kinder.

Hier ist, was ich bisher versucht habe:
Ich habe eine Unterklasse einer QTreeView wobei ich checke für Sie die shift-Taste space-combo. Ich weiß, dass QModelIndex, lassen Sie mich pick ein bestimmtes Kind mit dem "Kind" - Funktion, aber das erfordert wissen, die Anzahl der Kinder. Ich bin in der Lage, um die Anzahl der Kinder, indem man die internalPointer, aber das nur gibt mir die info für die erste Ebene der Hierarchie. Wenn ich versuche, Rekursion zu verwenden, bekomme ich eine Reihe von Kind zählt, aber dann bin ich verloren, wie man diese zurück konvertiert in ein gültiges QModelIndex.

Hier einige code:

def keyPressEvent(self, event):
    """
    Capture key press events to handle:
    - enable/disable
    """
    #shift - space means toggle expanded/collapsed for all children
    if (event.key() == QtCore.Qt.Key_Space and 
        event.modifiers() & QtCore.Qt.ShiftModifier):
        expanded = self.isExpanded(self.selectedIndexes()[0])
        for cellIndex in self.selectedIndexes():
            if cellIndex.column() == 0: #only need to call it once per row
                #I can get the actual object represented here
                item = cellIndex.internalPointer()
                #and I can get the number of children from that
                numChildren = item.get_child_count()
                #but now what? How do I convert this number into valid
                #QModelIndex objects? I know I could use: 
                #   cellIndex.child(row, 0)
                #to get the immediate children's QModelIndex's, but how
                #would I deal with grandchildren, great grandchildren, etc...
                self.setExpanded(cellIndex, not(expanded))
        return

Hier ist der Anfang der Rekursion Methode, die ich untersucht wurde, aber ich stecken bleiben, wenn tatsächlich versucht, in den erweiterten Zustand, da einmal in der Rekursion, verliere ich den "Kontakt" mit jeder gültigen QModelIndex...

def toggle_expanded(self, item, expand):
    """
    Toggles the children of item (recursively)
    """
    for row in range(0,item.get_child_count()):
        newItem = item.get_child_at_row(row)
        self.toggle_expanded(newItem, expand)
    #well... I'm stuck here because I'd like to toggle the expanded
    #setting of the "current" item, but I don't know how to convert
    #my pointer to the object represented in the tree view back into
    #a valid QModelIndex
    #self.setExpanded(?????, expand)   #<- What I'd like to run
    print "Setting", item.get_name(), "to", str(expand) #<- simple debug statement that indicates that the concept is valid

Danke an alle für die Zeit nehmen, dies zu betrachten!

InformationsquelleAutor bvz | 2010-11-04

Schreibe einen Kommentar