(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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok... Geschwister eigentlich gar nicht bekommen, wo ich gehen wollte. Ich es geschafft, der code arbeitet wie folgt (und es scheint wie eine menschenwürdige Umsetzung). Ein dickes Lob noch an Prof. Ebral, die mich auf dem richtigen Weg mit der Idee der Geschwister (stellt sich heraus, ich brauchte, um QModelIndex.Kind(Zeile, Spalte) und die Iteration rekursiv aus).
Beachten Sie, dass die folgende Annahme im code: Es wird davon ausgegangen, dass die zugrunde liegenden Daten speichern Objekte haben die Fähigkeit, zu berichten, wie viele Kinder Sie haben (get_child_count() in meinem code). Wenn das nicht der Fall ist, Sie haben irgendwie ein Kind zu bekommen, zählen anders... vielleicht nur willkürlich zu versuchen, um Kind-Indizes - mit QModelIndex.Kind(row, col) - mit einer ständig wachsenden Reihe zählen, bis Sie wieder der index ungültig ist? - dies ist, was Prof. Ebral vorgeschlagen, und ich könnte noch versuchen, dass (Es ist nur so, dass ich bereits eine einfache Möglichkeit, um das Kind zählen, indem Sie die ersuchende es von meinen Daten speichern).
Beachten Sie auch, dass ich tatsächlich zu erweitern/collpase jeder Knoten an einem anderen Punkt in der Rekursion, basierend auf, ob ich mich erweitern oder reduzieren. Dies ist, weil, durch Versuch und Irrtum, entdeckte ich, dass animierte tree-views würde Stottern und pop, wenn ich habe es nur an einer Stelle im code. Nun, durch die Umkehrung der Reihenfolge, in der ich es tun, basierend auf, ob ich mich auf der obersten Stufe (D. H. die Wurzel der Filiale bin ich beeinflussen - nicht die Wurzel des gesamten treeview) bekomme ich eine schöne glatte animation. Dies ist unten dokumentiert.
Den folgenden code in einem QTreeView Unterklasse.
InformationsquelleAutor bvz
Modell.rowCount(index) ist die Methode, die Sie wollen.
Modell.index(row,col, Eltern) ist im wesentlichen der gleiche wie der Aufruf von index.Kind(row,col); nur mit weniger indirections.
InformationsquelleAutor Paul Du Bois
ich würde empfehlen, mit einem QTreeWidget erbt die QTreeView. Sie können dann greifen die Kinder als QTreeWidgetItem.Da Sie nicht wollen, verwenden Sie die QTreeWidget aber halten wollen, um Ihre aktuelle Modell .. man kann Durchlaufen und die "möglichen" Kindern, .isValid(). Sollten Sie nicht verwenden die internalPointer() aber. Verwenden Sie stattdessen die cellItem Sie haben, wie es die ursprüngliche ModalIndex .. dann Versuch es zu finden die Geschwister. So etwas wie
Aus der Dokumentation --- Die Klasse QTreeWidget ist eine Komfort-Klasse bietet eine standard-tree-widget mit einem klassischen Element-basierten Schnittstelle, die ähnlich wie die von der Klasse QListView in Qt-3. Diese Klasse basiert auf Qt ' s Model/View-Architektur und nutzt eine Standard-Modell, um Einzelteile zu halten, von denen jede eine QTreeWidgetItem.
Aber da ich bereits ein Modell, die nicht viel eigene Arbeit, ich denke immer noch, ich kann nicht wechseln, da das Standard-Modell gebaut, in der QTreeWidget nicht eine der Sachen, die ich brauchen würde, es zu tun.
Ok .. ich werde ein anderes nehmen dann Aussehen.
Geschwister! Das könnte genau das richtige. Danke!
InformationsquelleAutor