Russian Qt Forum

Qt => Model-View (MV) => Тема начата: patison от Сентябрь 20, 2010, 12:13



Название: QAbstractItemModel и снова сортировка...
Отправлено: patison от Сентябрь 20, 2010, 12:13
Имеется класс, унаследованный от QAbstractItemModel (своя модель). Имеется QTreeView, куда выводится дерево с 4-я столбцами. Необходимо реализовать сортировку по клику на заголовки столбцов. Сама сортировка включена (sortEnabled), однако пока что она не работает.
Насколько я понял, необходимо писать реализацию метода sort(int column, Qt::SortOrder order). Однако я никак не пойму, что и как в этом методе нужно отсортировать. Член класса моей модели есть только один - MyModelItem *rootItem; , который указывает на корень.
Подскажите, в какую сторону двигаться что-бы реализовать сортировку?
Спасибо.


Название: Re: QAbstractItemModel и снова сортировка...
Отправлено: Karl-Philipp от Сентябрь 20, 2010, 12:17
QSortFilterProxyModel (http://doc.trolltech.com/4.6/qsortfilterproxymodel.html) вам в помощь :)


Название: Re: QAbstractItemModel и снова сортировка...
Отправлено: patison от Сентябрь 22, 2010, 20:41
По-моему то что нужно, однако есть маленькое "но".
В дереве имеются элементы двух типов, причём сначала должен идти первый тип, а после него второй. Когда я сортирую, скажем, по имени элемента, элементы выстраиваются строго в порядке названий, перемешиваясь между собой. Для выстраивания элементов по типам я переопределял setupModelData, и в нём это дело реализовывал. Думаю, что для того что-бы сортировался сначала первый тип элементов, а следом за ним второй тип (т.е. что-бы типы сами не перемешивались) необходимо переопределять какой-то из методов. Только вот какой и каким примерно образом?


Название: Re: QAbstractItemModel и снова сортировка...
Отправлено: Kolobok от Сентябрь 22, 2010, 20:58
Переопредели
Код:
bool QSortFilterProxyModel::lessThan ( const QModelIndex & left, const QModelIndex & right ) const


Название: Re: QAbstractItemModel и снова сортировка...
Отправлено: patison от Сентябрь 23, 2010, 12:39
Да, то что нужно.
Однако ещё один момент вылез. В моей модели я переопределил метод canFetchMore. Для теста я сделал так что он возвращает всё время true, т.е. у всех элементов по идее должен быть '+' слева от названия.
Однако, при использовании QSortFilterProxyModel, все элементы теперь не разворачиваемые. В сам метод canFetchMore вход происходит, однако почему-то возврат true никак не влияет на элементы... Если-же убрать прокси класс между моделью и отображением - то всё прекрасно работает. Как быть?..


Название: Re: QAbstractItemModel и снова сортировка...
Отправлено: Kolobok от Сентябрь 23, 2010, 13:18
Может потому, что прокси кэширует элементы и понимает, что его дурят.


Название: Re: QAbstractItemModel и снова сортировка...
Отправлено: patison от Октябрь 01, 2010, 13:57
Хм. А это как-то лечится вообще?


Название: Re: QAbstractItemModel и снова сортировка...
Отправлено: patison от Октябрь 05, 2010, 15:07
Переопределил canFetchMore в классе прокси (унаследованный от QSortFilterProxyModel), возвращая для всех элементов true. Однако это тоже почему-то не дало никаких результатов... Поистине странно.