Хорошо ... братья и сестры на самом деле не привели меня туда, куда я хотел пойти.Мне удалось заставить код работать следующим образом (и это похоже на достойную реализацию).Спасибо профессору Эбралу, который заставил меня идти по правильному пути с идеей братьев и сестер (оказывается, мне нужно было использовать QModelIndex.child (строка, столбец) и рекурсивно выполнять итерацию оттуда).
Обратите внимание, что тамэто следующее предположение в коде: Предполагается, что ваши базовые объекты хранилища данных могут сообщать, сколько у них дочерних элементов (get_child_count () в моем коде).Если это не так, вам каким-то образом придется рассчитывать количество дочерних элементов по-другому ... возможно, просто произвольно пытаясь получить дочерние индексы - используя QModelIndex.child (row, col) - с постоянно увеличивающимся числом строк, пока не вернетесьневерный индекс?- это то, что предложил проф. Эбрал, и я все еще могу попробовать это (просто у меня уже есть простой способ подсчитать количество детей, запросив его из моего хранилища данных).
Также обратите внимание, что я на самом делеРазверните / сверните каждый узел в другой точке рекурсии в зависимости от того, развертываюсь ли я или сворачиваюсь.Это связано с тем, что методом проб и ошибок я обнаружил, что анимированные представления дерева будут заикаться и всплывать, если я просто сделаю это в одном месте кода.Теперь, меняя порядок, в котором я это делаю, основываясь на том, нахожусь ли я на верхнем уровне (то есть на корне ветви, на которую я воздействую, а не на корне всего дерева), я получаю приятную плавную анимацию.Это документировано ниже.
Следующий код находится в подклассе QTreeView.
#---------------------------------------------------------------------------
def keyPressEvent(self, event):
if (event.key() == QtCore.Qt.Key_Space and self.currentIndex().column() == 0):
shift = event.modifiers() & QtCore.Qt.ShiftModifier
if shift:
self.expand_all(self.currentIndex())
else:
expand = not(self.isExpanded(self.currentIndex()))
self.setExpanded(self.currentIndex(), expand)
#---------------------------------------------------------------------------
def expand_all(self, index):
"""
Expands/collapses all the children and grandchildren etc. of index.
"""
expand = not(self.isExpanded(index))
if not expand: #if collapsing, do that first (wonky animation otherwise)
self.setExpanded(index, expand)
childCount = index.internalPointer().get_child_count()
self.recursive_expand(index, childCount, expand)
if expand: #if expanding, do that last (wonky animation otherwise)
self.setExpanded(index, expand)
#---------------------------------------------------------------------------
def recursive_expand(self, index, childCount, expand):
"""
Recursively expands/collpases all the children of index.
"""
for childNo in range(0, childCount):
childIndex = index.child(childNo, 0)
if expand: #if expanding, do that first (wonky animation otherwise)
self.setExpanded(childIndex, expand)
subChildCount = childIndex.internalPointer().get_child_count()
if subChildCount > 0:
self.recursive_expand(childIndex, subChildCount, expand)
if not expand: #if collapsing, do it last (wonky animation otherwise)
self.setExpanded(childIndex, expand)