PyQt: Как правильно развернуть узлы QTreeView после сортировки - PullRequest
1 голос
/ 15 апреля 2010

Я пишу простую тестовую программу с использованием QTreeModel и QTreeView для более сложного проекта позже. В этой простой программе у меня есть данные в группах, которые могут быть сокращены или расширены, как и следовало ожидать в QTreeView. Данные также могут быть отсортированы по различным столбцам данных (QTreeView.setSortingEnabled имеет значение True). Каждый элемент дерева представляет собой список данных, поэтому функция сортировки, реализованная в классе TreeModel, использует встроенную сортировку списка Python:

self.layoutAboutToBeChanged.emit()  
self.rootItem.childItems.sort(key=lambda x: x.itemData[col], reverse=order)  
for item in self.rootItem.childItems:  
    item.childItems.sort(key=lambda x: x.itemData[col], reverse=order)  
self.layoutChanged.emit()

Проблема в том, что всякий раз, когда я меняю сортировку дочерних элементов корня (дерево имеет только 2 уровня глубины, так что это единственный уровень с дочерними элементами), узлы не обязательно расширяются, как это было раньше. Если я изменю сортировку обратно без расширения или свертывания чего-либо, узлы будут расширены, как до изменения сортировки.
Может кто-нибудь объяснить мне, что я делаю не так? Я подозреваю, что это не правильно переназначить QModelIndex с отсортированными узлами, но я не уверен.

Ответы [ 2 ]

2 голосов
/ 11 декабря 2010

Чтобы ответить на ваш вопрос «что я делаю не так» - вы не обновляли постоянные модельные индексы до создания layoutChanged (). Клиенты вашей модели волшебным образом не знают, как изменились данные вашей модели; например, они не знают, что индекс (2,0, корень) переместился в (12,0, корень).

Способ, которым вы сообщаете об изменениях, - это излучение сигналов макета; Вы правильно поняли эту часть. Qt, скорее всего, отвечает на layoutAboutToBeChanged (), конвертируя все сохраненные им QModelIndex в QPersistentModelIndex. Когда он получает layoutChanged (), он конвертирует их обратно. Между прочим, вы должны просмотреть этот список QPersistentModelIndex и обновить индексы новыми местоположениями. Проверьте документы на наличие сигнала layoutChanged ().

1 голос
/ 17 апреля 2010

Я решил проблему, реализовав QSortFilterProxyModel для сортировки.

...