Я хочу иметь возможность разворачивать или сворачивать все дочерние элементы определенной ветки в QTreeView. Я использую PyQt4.
Я знаю, что QTreeView имеет функцию расширения всех дочерних элементов, которая привязана к *, но мне нужны две вещи: она должна быть привязана к другой комбинации клавиш (shift-space), и мне также нужно иметь возможность свернуть все дочерние элементы. .
Вот что я пробовал до сих пор: у меня есть подкласс QTreeView, в котором я проверяю комбинацию клавиш Shift-Space. Я знаю, что QModelIndex позволит мне выбрать конкретный дочерний элемент с помощью «дочерней» функции, но для этого нужно знать количество дочерних элементов. Я могу получить количество дочерних элементов, взглянув на internalPointer, но это дает мне информацию только для первого уровня иерархии. Если я попытаюсь использовать рекурсию, я могу получить кучу дочерних счетчиков, но тогда я потеряюсь в том, как преобразовать их обратно в действительный QModelIndex.
Вот код:
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
Вот начало метода рекурсии, который я исследовал, но я застреваю, когда на самом деле пытаюсь установить расширенное состояние, потому что, оказавшись внутри рекурсии, я теряю «контакт» с любым действительным индексом 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
Спасибо всем за то, что нашли время, чтобы посмотреть на это!